352 lines
15 KiB
PHP
352 lines
15 KiB
PHP
<?php
|
|
declare(strict_types=1);
|
|
namespace zin;
|
|
|
|
requireWg('thinkQuestion');
|
|
/**
|
|
* 思引师表格填空部件类。
|
|
* thinmory tableInput widget class.
|
|
*/
|
|
class thinkTableInput extends thinkQuestion
|
|
{
|
|
protected static array $defineProps = array(
|
|
'requiredRows?: number=1', // 必填行数
|
|
'fields?: array', // 行标题
|
|
'supportAdd?: bool', // 是否支持用户添加行
|
|
'canAddRows: number=1', // 可添加行数
|
|
'inputType?: bool=flase', // 输入类型
|
|
);
|
|
|
|
public static function getPageJS(): string
|
|
{
|
|
return file_get_contents(__DIR__ . DS . 'js' . DS . 'v1.js');
|
|
}
|
|
|
|
public static function getPageCSS(): ?string
|
|
{
|
|
$baseCss = file_get_contents(dirname(__FILE__, 2) . DS . 'thinkstepbase' . DS . 'css' . DS . 'v1.css');
|
|
return file_get_contents(__DIR__ . DS . 'css' . DS . 'v1.css') . $baseCss;
|
|
}
|
|
|
|
protected function buildDetail(): array
|
|
{
|
|
global $lang, $config;
|
|
$detailWg = parent::buildDetail();
|
|
list($step, $fields, $supportAdd, $canAddRows, $mode, $inputType, $wizard, $quotedQuestions) = $this->prop(array('step', 'fields', 'supportAdd', 'canAddRows', 'mode', 'inputType', 'wizard', 'quotedQuestions'));
|
|
if($mode != 'detail') return array();
|
|
|
|
$wizard->config = !empty($wizard->config) ? $wizard->config : array();
|
|
$wizard->config = is_string($wizard->config) ? json_decode($wizard->config, true) : $wizard->config;
|
|
$configureDimension = !empty($wizard->config['configureDimension']) ? $wizard->config['configureDimension'] : array();
|
|
$canConfigureRatio = !empty($configureDimension['canConfigureRatio']) ? $configureDimension['canConfigureRatio'] : '0';
|
|
|
|
if($step)
|
|
{
|
|
$fields = $step->options->fields;
|
|
$supportAdd = $step->options->supportAdd;
|
|
$canAddRows = $step->options->canAddRows;
|
|
$answer = $step->answer;
|
|
$result = isset($answer->result) && !empty($answer->result) ? (array) $answer->result : array();
|
|
$customFields = !empty($answer->customFields) ? get_object_vars($answer->customFields) : array();
|
|
$inputType = isset($step->options->inputType) ? $step->options->inputType : false;
|
|
}
|
|
|
|
$tableInputItems = array();
|
|
$disabledAdd = !empty($customFields) && (int)$canAddRows <= count($customFields);
|
|
$fields = !empty($fields) ? $fields : array($lang->thinkwizard->rowReference, $lang->thinkwizard->rowReference, $lang->thinkwizard->rowReference);
|
|
$index = 0;
|
|
foreach($fields as $item)
|
|
{
|
|
$value = !empty($result) && isset($result[$index]) ? $result[$index] : '';
|
|
$amountUnit = !empty($answer->amountUnit) ? $answer->amountUnit[$index] : '';
|
|
$tableInputItems[] = array(
|
|
formGroup
|
|
(
|
|
setClass('flex items-center table-input-item'),
|
|
div
|
|
(
|
|
setClass('text-right mr-2 w-24 line-clamp-2 break-words'),
|
|
$item,
|
|
set::title($item)
|
|
),
|
|
div
|
|
(
|
|
set::title($value),
|
|
setClass(empty($inputType) ? 'result-width' : '', $index == 0 ? '' : 'mt-2'),
|
|
empty($inputType) ? textarea
|
|
(
|
|
set::rows('2'),
|
|
set::name('result[' . $index . ']'),
|
|
set::value($value),
|
|
set::placeholder($lang->thinkrun->pleaseInput),
|
|
set::readonly($value && !empty($quotedQuestions))
|
|
) : null,
|
|
(!empty($inputType) && $inputType == '1') ? inputControl
|
|
(
|
|
input(set(array(
|
|
'class' => 'w-72 h-10 dimension-weight',
|
|
'name' => 'result[' . $index . ']',
|
|
'type' => 'number',
|
|
'min' => 1,
|
|
'max' => 100,
|
|
'value' => $value,
|
|
'readonly' => ($value && !$canConfigureRatio),
|
|
'placeholder' => $lang->thinkrun->pleaseInput
|
|
)),
|
|
on::input('changePercentInput')
|
|
),
|
|
to::suffix($lang->thinkwizard->dimension->percentageSign),
|
|
set::suffixWidth(32)
|
|
) : null,
|
|
(!empty($inputType) && $inputType == '2') ? inputGroup
|
|
(
|
|
input(set(array(
|
|
'class' => 'w-64 h-10 result-amount',
|
|
'name' => 'result[' . $index . ']',
|
|
'type' => 'number',
|
|
'min' => 0,
|
|
'value' => $value,
|
|
'readonly' => ($value && !empty($quotedQuestions)),
|
|
'placeholder' => $lang->thinkrun->pleaseInput
|
|
)),
|
|
on::input('changePriceInput')
|
|
),
|
|
picker
|
|
(
|
|
setClass('amount-unit'),
|
|
set::name('amountUnit[' . $index . ']'),
|
|
set::required(true),
|
|
set::items($lang->thinkrun->amountUnit),
|
|
set::value($amountUnit),
|
|
)
|
|
)
|
|
: null,
|
|
),
|
|
div
|
|
(
|
|
setClass('flex'),
|
|
setStyle(array('min-width' => '40px')),
|
|
($index == count($fields) - 1 && $supportAdd) ? icon
|
|
(
|
|
'plus',
|
|
setClass('mr-1 btn-add ml-2 text-sm text-primary add-rows cursor-pointer', $disabledAdd ? 'disabled' : ''),
|
|
setData('canAddRows', $canAddRows),
|
|
setData('fieldsCount', count($fields)),
|
|
set::title(sprintf($lang->thinkrun->tips->add, $canAddRows)),
|
|
) : null,
|
|
)
|
|
),
|
|
);
|
|
$index ++;
|
|
}
|
|
if(!empty($customFields))
|
|
{
|
|
foreach($customFields as $item)
|
|
{
|
|
$customValue = !empty($result) && isset($result[$index]) ? $result[$index] : '';
|
|
$tableInputItems[] = formGroup
|
|
(
|
|
setClass('flex rows-group flex-nowrap items-center'),
|
|
div
|
|
(
|
|
set::title($item),
|
|
setClass('mt-2 w-24'),
|
|
textarea
|
|
(
|
|
set::rows('2'),
|
|
setID('customFields'),
|
|
set::name('customFields[' . $index . ']'),
|
|
set::value($item),
|
|
set::placeholder($lang->thinkrun->placeholder->rowTitle)
|
|
)
|
|
),
|
|
div
|
|
(
|
|
set::title($customValue),
|
|
setClass('mt-2 ml-2 result-width'),
|
|
textarea
|
|
(
|
|
set::rows('2'),
|
|
setID('result'),
|
|
set::name('result[' . $index .']'),
|
|
set::value($customValue),
|
|
set::placeholder($lang->thinkrun->placeholder->rowContent)
|
|
)
|
|
),
|
|
div
|
|
(
|
|
setClass('flex'),
|
|
setStyle(array('min-width' => '40px')),
|
|
icon
|
|
(
|
|
'plus',
|
|
setClass('mr-1 btn-add ml-2 text-sm text-primary add-rows', $disabledAdd ? 'disabled' : ''),
|
|
setData('canAddRows', $canAddRows),
|
|
setData('fieldsCount', count($fields)),
|
|
set::title(sprintf($lang->thinkrun->tips->add, $canAddRows)),
|
|
),
|
|
icon
|
|
(
|
|
setClass('btn-delete text-sm text-primary ml-1'),
|
|
setData('canAddRows', $canAddRows),
|
|
setData('fieldsCount', count($fields)),
|
|
setData('deleteTip', $lang->thinkrun->tips->delete),
|
|
'trash'
|
|
)
|
|
)
|
|
);
|
|
$index ++;
|
|
}
|
|
}
|
|
|
|
$detailWg[] = array(
|
|
$tableInputItems,
|
|
formGroup
|
|
(
|
|
setClass('flex rows-template flex-nowrap items-center hidden'),
|
|
textarea
|
|
(
|
|
set::rows('2'),
|
|
setID('customFields'),
|
|
setClass('mt-2 w-24'),
|
|
set::value(''),
|
|
set::placeholder($lang->thinkrun->placeholder->rowTitle)
|
|
),
|
|
textarea
|
|
(
|
|
set::rows('2'),
|
|
setID('result'),
|
|
setClass('mt-2 result-width ml-2'),
|
|
set::value(''),
|
|
set::placeholder($lang->thinkrun->placeholder->rowContent)
|
|
),
|
|
div
|
|
(
|
|
setClass('flex'),
|
|
setStyle(array('min-width' => '40px')),
|
|
icon
|
|
(
|
|
'plus',
|
|
setClass('mr-1 btn-add ml-2 text-sm text-primary add-rows cursor-pointer'),
|
|
setData('canAddRows', $canAddRows),
|
|
setData('fieldsCount', count($fields)),
|
|
set::title(sprintf($lang->thinkrun->tips->add, $canAddRows)),
|
|
),
|
|
icon
|
|
(
|
|
setClass('btn-delete text-sm text-primary ml-1 cursor-pointer'),
|
|
setData('canAddRows', $canAddRows),
|
|
setData('fieldsCount', count($fields)),
|
|
setData('deleteTip', $lang->thinkrun->tips->delete),
|
|
'trash'
|
|
)
|
|
)
|
|
)
|
|
);
|
|
return $detailWg;
|
|
}
|
|
|
|
protected function buildFormItem(): array
|
|
{
|
|
global $lang, $app;
|
|
$app->loadLang('thinkstep');
|
|
$formItems = parent::buildFormItem();
|
|
|
|
list($step, $required, $requiredRows, $supportAdd, $canAddRows, $fields, $inputType) = $this->prop(array('step','required', 'requiredRows', 'supportAdd', 'canAddRows', 'fields', 'inputType'));
|
|
if($step)
|
|
{
|
|
$required = $step->options->required;
|
|
if(!empty($step->options->fields)) $step->options->fields = is_string($step->options->fields) ? explode(', ', $step->options->fields) : array_values((array)$step->options->fields);
|
|
$fields = $step->options->fields ?? array();
|
|
$requiredRows = $step->options->requiredRows;
|
|
$supportAdd = $step->options->supportAdd;
|
|
$canAddRows = $step->options->canAddRows;
|
|
$inputType = isset($step->options->inputType) ? $step->options->inputType : false;
|
|
}
|
|
|
|
$formItems[] = array (
|
|
formHidden('options[questionType]', 'tableInput'),
|
|
formHidden('options[inputType]', $inputType),
|
|
formRow
|
|
(
|
|
setClass('mb-3'),
|
|
formGroup
|
|
(
|
|
setClass('w-1/2 step-required'),
|
|
set::label($lang->thinkstep->label->required),
|
|
radioList
|
|
(
|
|
set::name('options[required]'),
|
|
set::inline(true),
|
|
set::items($lang->thinkstep->requiredList),
|
|
set::value($required),
|
|
on::change()->toggleClass('.required-rows', 'hidden', 'target.value == 0')
|
|
)
|
|
),
|
|
formGroup
|
|
(
|
|
setClass('w-1/2 required-rows', $required ? '' : 'hidden'),
|
|
set::label($lang->thinkstep->label->requiredRows),
|
|
set::labelClass('required'),
|
|
input
|
|
(
|
|
set::type('number'),
|
|
set::name('options[requiredRows]'),
|
|
set::value($requiredRows),
|
|
set::placeholder($lang->thinkstep->placeholder->inputContent),
|
|
set::min(1),
|
|
on::input('changeInput')
|
|
)
|
|
)
|
|
),
|
|
formRow
|
|
(
|
|
setClass('mb-3'),
|
|
formGroup
|
|
(
|
|
setClass('w-1/2'),
|
|
set::label($lang->thinkstep->label->isSupportAdd),
|
|
radioList
|
|
(
|
|
set::name('options[supportAdd]'),
|
|
set::inline(true),
|
|
set::items($lang->thinkstep->requiredList),
|
|
set::value($supportAdd ? $supportAdd : 0),
|
|
on::change()->toggleClass('.can-add-rows', 'hidden', 'target.value == 0')
|
|
)
|
|
),
|
|
formGroup
|
|
(
|
|
setClass('w-1/2 can-add-rows', $supportAdd ? '' : 'hidden'),
|
|
set::label($lang->thinkstep->label->canAddRows),
|
|
set::labelClass('required'),
|
|
input
|
|
(
|
|
set::type('number'),
|
|
set::name('options[canAddRows]'),
|
|
set::value($canAddRows),
|
|
set::placeholder($lang->thinkstep->placeholder->inputContent),
|
|
set::min(1),
|
|
on::input('changeInput')
|
|
)
|
|
)
|
|
),
|
|
formGroup
|
|
(
|
|
set::width('full'),
|
|
set::label($lang->thinkstep->label->rowsTitle),
|
|
thinkoptions
|
|
(
|
|
set(array(
|
|
'showOther' => false,
|
|
'data' => $fields,
|
|
'name' => 'options[fields]',
|
|
))
|
|
),
|
|
),
|
|
$this->children()
|
|
);
|
|
return $formItems;
|
|
}
|
|
}
|