Skip to content

Commit f906153

Browse files
committed
add some fields
1 parent c329466 commit f906153

42 files changed

Lines changed: 7225 additions & 116 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.eslintignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
**/*.js
2+
extra
3+
node_modules/**

.eslintrc.js

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
module.exports = {
2+
root: true,
3+
parser: "@typescript-eslint/parser",
4+
parserOptions: {
5+
tsconfigRootDir: __dirname,
6+
project: ["./tsconfig.json"]
7+
},
8+
plugins: ["@typescript-eslint"],
9+
extends: [
10+
"eslint:recommended",
11+
"plugin:@typescript-eslint/recommended",
12+
"plugin:@typescript-eslint/recommended-requiring-type-checking",
13+
"prettier",
14+
"prettier/@typescript-eslint"
15+
],
16+
rules: {
17+
"@typescript-eslint/ban-types": [
18+
"error", {
19+
types: {
20+
"object": false
21+
},
22+
extendDefaults: true
23+
}
24+
],
25+
"@typescript-eslint/no-explicit-any": 0,
26+
"@typescript-eslint/no-non-null-assertion": 0,
27+
"@typescript-eslint/no-unsafe-assignment": 0,
28+
"@typescript-eslint/no-unsafe-call": 0,
29+
"@typescript-eslint/no-unsafe-member-access": 0,
30+
"@typescript-eslint/no-unsafe-return": 0,
31+
"@typescript-eslint/no-unused-vars": [
32+
"error", {
33+
"argsIgnorePattern": "^_"
34+
}
35+
],
36+
"@typescript-eslint/no-misused-promises": [
37+
"error", {
38+
"checksVoidReturn": false
39+
}
40+
]
41+
}
42+
};
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
<ul id="{@$field->getPrefixedID()}_attachmentList" {*
2+
*}class="formAttachmentList mcFormAttachmentList jsObjectActionContainer" {*
3+
*}data-object-action-class-name="wcf\data\attachment\AttachmentAction"{*
4+
*}{if !$field->getAttachmentHandler()->getAttachmentList()|count} style="display: none"{/if}{*
5+
*}>
6+
{foreach from=$field->getAttachmentHandler()->getAttachmentList() item=$attachment}
7+
<li class="box64 jsObjectActionObject" {*
8+
*}data-object-id="{@$attachment->getObjectID()}" {*
9+
*}data-height="{@$attachment->height}" {*
10+
*}data-width="{@$attachment->width}" {*
11+
*}data-is-image="{@$attachment->isImage}"{*
12+
*}>
13+
{if $attachment->tinyThumbnailType}
14+
<img src="{$attachment->getThumbnailLink('tiny')}" alt="" class="attachmentTinyThumbnail">
15+
{else}
16+
<span class="icon icon64 fa-{@$attachment->getIconName()}"></span>
17+
{/if}
18+
19+
<div>
20+
<div>
21+
<p><a href="{$attachment->getLink()}" target="_blank"{if $attachment->isImage} title="{$attachment->filename}" class="jsImageViewer"{/if}>{$attachment->filename}</a></p>
22+
<small>{@$attachment->filesize|filesize}</small>
23+
</div>
24+
25+
<ul class="buttonGroup">
26+
<li><span class="button small jsObjectAction" data-object-action="delete" data-confirm-message="{lang}wcf.attachment.delete.sure{/lang}">{lang}wcf.global.button.delete{/lang}</span></li>
27+
{if $attachment->isImage}
28+
{if $attachment->thumbnailType}
29+
<li><span class="button small jsButtonAttachmentInsertThumbnail" data-object-id="{@$attachment->attachmentID}" data-url="{$attachment->getThumbnailLink('thumbnail')}">{lang}wcf.attachment.insertThumbnail{/lang}</span></li>
30+
{/if}
31+
<li><span class="button small jsButtonAttachmentInsertFull" data-object-id="{@$attachment->attachmentID}" data-url="{$attachment->getLink()}">{lang}wcf.attachment.insertFull{/lang}</span></li>
32+
{else}
33+
<li><span class="button small jsButtonInsertAttachment" data-object-id="{@$attachment->attachmentID}">{lang}wcf.attachment.insert{/lang}</span></li>
34+
{/if}
35+
</ul>
36+
</div>
37+
</li>
38+
{/foreach}
39+
</ul>
40+
<div id="{@$field->getPrefixedID()}_uploadButton" class="formAttachmentButtons" data-max-size="{@$field->getAttachmentHandler()->getMaxSize()}"></div>
41+
42+
<script data-relocate="true">
43+
require(['Language'], (Language) => {
44+
Language.addObject({
45+
'wcf.attachment.upload.error.invalidExtension': '{jslang}wcf.attachment.upload.error.invalidExtension{/jslang}',
46+
'wcf.attachment.upload.error.tooLarge': '{jslang}wcf.attachment.upload.error.tooLarge{/jslang}',
47+
'wcf.attachment.upload.error.reachedLimit': '{jslang}wcf.attachment.upload.error.reachedLimit{/jslang}',
48+
'wcf.attachment.upload.error.reachedRemainingLimit': '{jslang}wcf.attachment.upload.error.reachedRemainingLimit{/jslang}',
49+
'wcf.attachment.upload.error.uploadFailed': '{jslang}wcf.attachment.upload.error.uploadFailed{/jslang}',
50+
'wcf.attachment.upload.error.uploadPhpLimit': '{jslang}wcf.attachment.upload.error.uploadPhpLimit{/jslang}',
51+
'wcf.attachment.insert': '{jslang}wcf.attachment.insert{/jslang}',
52+
'wcf.attachment.insertAll': '{jslang}wcf.attachment.insertAll{/jslang}',
53+
'wcf.attachment.insertFull': '{jslang}wcf.attachment.insertFull{/jslang}',
54+
'wcf.attachment.insertThumbnail': '{jslang}wcf.attachment.insertThumbnail{/jslang}',
55+
'wcf.attachment.delete.sure': '{jslang}wcf.attachment.delete.sure{/jslang}'
56+
});
57+
58+
new WCF.Attachment.Upload(
59+
$('#{@$field->getPrefixedID()}_uploadButton'),
60+
$('#{@$field->getPrefixedID()}_attachmentList'),
61+
'{@$field->getAttachmentHandler()->getObjectType()->objectType}',
62+
'{@$field->getAttachmentHandler()->getObjectID()}',
63+
'{$field->getAttachmentHandler()->getTmpHashes()[0]|encodeJS}',
64+
'{@$field->getAttachmentHandler()->getParentObjectID()}',
65+
{@$field->getAttachmentHandler()->getMaxCount()}
66+
);
67+
});
68+
</script>
69+
70+
<input type="hidden" id="{@$field->getPrefixedID()}_tmpHash" name="{@$field->getPrefixedID()}_tmpHash" value="{$field->getAttachmentHandler()->getTmpHashes()[0]}">
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
{assign var='__badgeColorFormFieldCustomValue' value=$field->hasCustomValue()}
2+
3+
<ul class="inlineList badgeColorFormFieldList">
4+
{foreach from=$field->getAvailableClasses() item=__className}
5+
<li>
6+
<label>
7+
<input {*
8+
*}type="radio" {*
9+
*}name="{@$field->getPrefixedId()}" {*
10+
*}{if $field->getValue() !== null && $field->getValue() === $__className}checked {/if}{*
11+
*}value="{$__className}" {*
12+
*}>
13+
<span class="badge label jsLabelPreview{if $__className !== 'none'} {$__className}{/if}">{$field->getReferenceText()}</span>
14+
</label>
15+
</li>
16+
{/foreach}
17+
{if $field->supportsCustom()}
18+
<li class="labelCustomClass">
19+
<input {*
20+
*}type="radio" {*
21+
*}name="{@$field->getPrefixedId()}" {*
22+
*}class="jsCustomCssClassName"{*
23+
*}{if $__badgeColorFormFieldCustomValue} checked{/if} {*
24+
*}value="custom" {*
25+
*}>
26+
<span>
27+
<input type="text" {*
28+
*}id="{@$field->getPrefixedId()}_className" {*
29+
*}name="{@$field->getPrefixedId()}_className" {*
30+
*}value="{if $__badgeColorFormFieldCustomValue}{$field->getValue()}{/if}" {*
31+
*}class="long"{*
32+
*}{if $field->isAutofocused()} autofocus{/if}{*
33+
*}{if $field->isImmutable()} disabled{/if}{*
34+
*}>
35+
</span>
36+
</li>
37+
{/if}
38+
</ul>
39+
40+
<script data-relocate="true">
41+
require(['MysteryCode/Form/Builder/LabelPreviewHandler'], ({ LabelPreviewHandler }) => {
42+
const dlSelector = '#{@$field->getPrefixedId()}Container';
43+
44+
{if $field->getReferenceFieldId()}
45+
new LabelPreviewHandler(
46+
'{@$field->getPrefixedId()}Container',
47+
'{@$field->getReferencedNode()->getPrefixedId()}',
48+
'{@$field->getReferenceText()}'
49+
);
50+
{/if}
51+
{if $field->supportsCustom()}
52+
document.getElementById('{@$field->getPrefixedId()}_className').addEventListener('focus', (event) => {
53+
document.querySelector(dlSelector + ' .jsCustomCssClassName').checked = true;
54+
});
55+
{/if}
56+
});
57+
</script>
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
require(['MysteryCode/Form/Builder/Field/Dependency/ItemList'], ({ ItemList }) => {
2+
// dependency '{@$dependency->getId()}'
3+
new ItemList(
4+
'{@$dependency->getDependentNode()->getPrefixedId()}Container',
5+
'{@$dependency->getField()->getPrefixedId()}'
6+
).state({@$dependency->getState()})
7+
.values({if $dependency->getValues() === null}null{else}[ {implode from=$dependency->getValues() item=dependencyValue}'{$dependencyValue|encodeJS}'{/implode} ]{/if})
8+
.negate({if $dependency->isNegated()}true{else}false{/if});
9+
});
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
require(['MysteryCode/Form/Builder/Field/Dependency/Numeric'], ({ Numeric }) => {
2+
// dependency '{@$dependency->getId()}'
3+
new Numeric(
4+
'{@$dependency->getDependentNode()->getPrefixedId()}Container',
5+
'{@$dependency->getField()->getPrefixedId()}'
6+
).referenceValue({@$dependency->getReferenceValue()})
7+
.operator('{@$dependency->getOperator()}');
8+
});
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
<ul id="{@$field->getPrefixedID()}_attachmentList" {*
2+
*}class="formAttachmentList jsObjectActionContainer" {*
3+
*}data-object-action-class-name="wcf\data\attachment\AttachmentAction"{*
4+
*}{if !$field->getAttachmentHandler()->getAttachmentList()|count} style="display: none"{/if}{*
5+
*}>
6+
{foreach from=$field->getAttachmentHandler()->getAttachmentList() item=$attachment}
7+
<li class="box64 jsObjectActionObject" {*
8+
*}data-object-id="{@$attachment->getObjectID()}" {*
9+
*}data-height="{@$attachment->height}" {*
10+
*}data-width="{@$attachment->width}" {*
11+
*}data-is-image="{@$attachment->isImage}"{*
12+
*}>
13+
{if $attachment->tinyThumbnailType}
14+
<img src="{$attachment->getThumbnailLink('tiny')}" alt="" class="attachmentTinyThumbnail">
15+
{else}
16+
<span class="icon icon64 fa-{@$attachment->getIconName()}"></span>
17+
{/if}
18+
19+
<div>
20+
<div>
21+
<p><a href="{$attachment->getLink()}" target="_blank"{if $attachment->isImage} title="{$attachment->filename}" class="jsImageViewer"{/if}>{$attachment->filename}</a></p>
22+
<small>{@$attachment->filesize|filesize}</small>
23+
</div>
24+
25+
<ul class="buttonGroup">
26+
<li><span class="button small jsObjectAction" data-object-action="delete" data-confirm-message="{lang}wcf.attachment.delete.sure{/lang}">{lang}wcf.global.button.delete{/lang}</span></li>
27+
{if $attachment->isImage}
28+
{if $attachment->thumbnailType}
29+
<li><span class="button small jsButtonAttachmentInsertThumbnail" data-object-id="{@$attachment->attachmentID}" data-url="{$attachment->getThumbnailLink('thumbnail')}">{lang}wcf.attachment.insertThumbnail{/lang}</span></li>
30+
{/if}
31+
<li><span class="button small jsButtonAttachmentInsertFull" data-object-id="{@$attachment->attachmentID}" data-url="{$attachment->getLink()}">{lang}wcf.attachment.insertFull{/lang}</span></li>
32+
{else}
33+
<li><span class="button small jsButtonInsertAttachment" data-object-id="{@$attachment->attachmentID}">{lang}wcf.attachment.insert{/lang}</span></li>
34+
{/if}
35+
</ul>
36+
</div>
37+
</li>
38+
{/foreach}
39+
</ul>
40+
<div id="{@$field->getPrefixedID()}_uploadButton" class="formAttachmentButtons" data-max-size="{@$field->getAttachmentHandler()->getMaxSize()}" data-internal-id="{@$field->getPrefixedID()}"></div>
41+
42+
<script data-relocate="true">
43+
require(['Language', 'MysteryCode/Ui/Attachment/Upload'], function(Language, { AttachmentUpload }) {
44+
Language.addObject({
45+
'wcf.attachment.upload.error.invalidExtension': '{jslang}wcf.attachment.upload.error.invalidExtension{/jslang}',
46+
'wcf.attachment.upload.error.tooLarge': '{jslang}wcf.attachment.upload.error.tooLarge{/jslang}',
47+
'wcf.attachment.upload.error.reachedLimit': '{jslang}wcf.attachment.upload.error.reachedLimit{/jslang}',
48+
'wcf.attachment.upload.error.reachedRemainingLimit': '{jslang}wcf.attachment.upload.error.reachedRemainingLimit{/jslang}',
49+
'wcf.attachment.upload.error.uploadFailed': '{jslang}wcf.attachment.upload.error.uploadFailed{/jslang}',
50+
'wcf.attachment.upload.error.uploadPhpLimit': '{jslang}wcf.attachment.upload.error.uploadPhpLimit{/jslang}',
51+
'wcf.attachment.insert': '{jslang}wcf.attachment.insert{/jslang}',
52+
'wcf.attachment.insertAll': '{jslang}wcf.attachment.insertAll{/jslang}',
53+
'wcf.attachment.insertFull': '{jslang}wcf.attachment.insertFull{/jslang}',
54+
'wcf.attachment.insertThumbnail': '{jslang}wcf.attachment.insertThumbnail{/jslang}',
55+
'wcf.attachment.delete.sure': '{jslang}wcf.attachment.delete.sure{/jslang}'
56+
});
57+
58+
new AttachmentUpload(
59+
'{@$field->getPrefixedID()}_uploadButton',
60+
'{@$field->getPrefixedID()}_attachmentList',
61+
'{@$field->getAttachmentHandler()->getObjectType()->objectType}',
62+
'{@$field->getAttachmentHandler()->getObjectID()}',
63+
'{$field->getAttachmentHandler()->getTmpHashes()[0]|encodeJS}',
64+
'{@$field->getAttachmentHandler()->getParentObjectID()}',
65+
{@$field->getAttachmentHandler()->getMaxCount()},
66+
'{@$field->getPrefixedWysiwygId()}'
67+
);
68+
});
69+
</script>
70+
71+
<input type="hidden" id="{@$field->getPrefixedID()}_tmpHash" name="{@$field->getPrefixedID()}_tmpHash" value="{$field->getAttachmentHandler()->getTmpHashes()[0]}">
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
<textarea {*
2+
*}id="{@$field->getPrefixedId()}" {*
3+
*}name="{@$field->getPrefixedId()}" {*
4+
*}class="wysiwygTextarea" {*
5+
*}data-disable-attachments="{if $field->supportsAttachments()}false{else}true{/if}" {*
6+
*}data-support-mention="{if $field->supportsMentions()}true{else}false{/if}"{*
7+
*}{if $field->getAutosaveId() !== null}{*
8+
*} data-autosave="{@$field->getAutosaveId()}"{*
9+
*}{if $field->getLastEditTime() !== 0}{*
10+
*} data-autosave-last-edit-time="{@$field->getLastEditTime()}"{*
11+
*}{/if}{*
12+
*}{/if}{*
13+
*}{foreach from=$field->getFieldAttributes() key='attributeName' item='attributeValue'} {$attributeName}="{$attributeValue}"{/foreach}{*
14+
*}>{if !$field->isI18n() || !$field->hasI18nValues() || $availableLanguages|count === 1}{$field->getValue()}{/if}</textarea>
15+
16+
{include file='wysiwyg' wysiwygSelector=$field->getPrefixedId()}
17+
18+
{if $field->supportsQuotes()}
19+
<script data-relocate="true">
20+
// Bootstrap for window.__wcf_bc_eventHandler
21+
require(['WoltLabSuite/Core/Bootstrap', 'WoltLabSuite/Core/Ui/Message/Quote'], (Bootstrap, UiMessageQuote) => {
22+
{include file='__messageQuoteManager' wysiwygSelector=$field->getPrefixedId() supportPaste=true}
23+
24+
{if $field->getQuoteData() !== null}
25+
const quoteHandler = new UiMessageQuote.default(
26+
$quoteManager,
27+
'{$field->getQuoteData('actionClass')|encodeJS}',
28+
'{$field->getQuoteData('objectType')}',
29+
'{$field->getQuoteData('selectors')[container]}',
30+
'{$field->getQuoteData('selectors')[messageBody]}',
31+
'{$field->getQuoteData('selectors')[messageContent]}',
32+
true
33+
);
34+
35+
document.getElementById('{@$field->getPrefixedId()}').setAttribute('data-quote-handler', quoteHandler);
36+
{/if}
37+
});
38+
</script>
39+
{/if}
40+
41+
{if $field->isI18n()}
42+
{include file='multipleLanguageInputJavascript'}
43+
{/if}
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
/**
2+
* Data handler for a ItemList-bases form builder field in an Ajax form.
3+
*
4+
* @author Florian Gail
5+
* @module MysteryCode/Form/Builder/Field/Dependency/ItemList
6+
*/
7+
define(["require", "exports", "tslib", "WoltLabSuite/Core/Form/Builder/Field/Dependency/Abstract", "WoltLabSuite/Core/Ui/ItemList", "WoltLabSuite/Core/Form/Builder/Field/Dependency/Manager"], function (require, exports, tslib_1, Abstract_1, UiItemList, DependencyManager) {
8+
"use strict";
9+
Object.defineProperty(exports, "__esModule", { value: true });
10+
exports.ItemList = void 0;
11+
Abstract_1 = tslib_1.__importDefault(Abstract_1);
12+
UiItemList = tslib_1.__importStar(UiItemList);
13+
DependencyManager = tslib_1.__importStar(DependencyManager);
14+
var State;
15+
(function (State) {
16+
State[State["Empty"] = 1] = "Empty";
17+
State[State["NonEmpty"] = 2] = "NonEmpty";
18+
})(State || (State = {}));
19+
class ItemList extends Abstract_1.default {
20+
constructor() {
21+
super(...arguments);
22+
this._values = null;
23+
}
24+
/**
25+
* Sets if the field value may not have any of the set values.
26+
*/
27+
negate(negate) {
28+
this._isNegated = negate;
29+
return this;
30+
}
31+
/**
32+
* Sets the possible values the field may have for the dependency to be met.
33+
*/
34+
values(values) {
35+
this._values = values;
36+
return this;
37+
}
38+
/**
39+
* Sets the state of the the dependency-field to be met.
40+
*/
41+
state(state) {
42+
this._state = state;
43+
return this;
44+
}
45+
checkDependency() {
46+
if (this._field !== null) {
47+
if (DependencyManager.isHiddenByDependencies(this._field)) {
48+
return false;
49+
}
50+
const values = UiItemList.getValues(this._field.id);
51+
if (this._state === State.Empty) {
52+
return values.length === 0;
53+
}
54+
else if (this._state === State.NonEmpty) {
55+
if (values.length < 1) {
56+
return false;
57+
}
58+
if (this._values !== null) {
59+
let foundMatch = false;
60+
this._values.forEach((value) => {
61+
values.forEach((selectedValue) => {
62+
if (value == selectedValue) {
63+
foundMatch = true;
64+
}
65+
});
66+
});
67+
return this._isNegated ? !foundMatch : foundMatch;
68+
}
69+
return true;
70+
}
71+
}
72+
return false;
73+
}
74+
}
75+
exports.ItemList = ItemList;
76+
exports.default = ItemList;
77+
});

0 commit comments

Comments
 (0)