Дерево галок
Дерево галок — выбор в иерархии: края и города, разделы и страницы, группы и права. У ветки трёхпозиционная галка — «включено», «снято» или «частично», — а сама ветка сворачивается.
Когда использовать#
- Человек отмечает часть большого перечня, который естественно делится на группы.
- По ветке нужно видеть сразу, выбрана ли она целиком, частично или нет.
- Пунктов тысяча и больше: ветки грузятся страницами по адресу, поиск спрашивает сервер, а форма отдаёт только правки — см. раздел «Тысяча пунктов» ниже.
Не берите дерево для плоского списка из нескольких пунктов — хватит флажков. Для перехода по разделам объекта есть дерево разделов, а для иерархии записей с колонками — таблица деревом.
В дереве холста узлы приходят первым аргументом — массивом структур узлов, а подпись дерева задаёт слово .Подпись(…) (см. Язык узлов); узел по одному добавляет слово .Узел(Модель).
Узлом холста — словами
Узлы = Новый Массив();
Узлы.Добавить(Новый Структура("Имя, Подпись", "город_1", "Архангельск"));
Узлы.Добавить(Новый Структура("Имя, Подпись, Состояние", "город_2", "Мурманск", "выкл"));
HTML = Кит.ДеревоГалок(Новый Структура("Узлы", Узлы)).Подпись("Где работаем").Рендер();Три состояния ветки#
Состояние узла — «вкл» (по умолчанию), «выкл» или «частично». Все три печатает сервер, и «частично» видно без скрипта: отмеченной галкой со знаком «—» вместо галочки.
Ветка — узел с ключом Дети. Она сворачивается нативной раскрывашкой с шевроном слева; Открыт присылает её раскрытой. Вложенность показывают отступ и линия слева.
Пояснение — приглушённая приписка после подписи: сколько внутри, что снято. Примечание — строка в конце ветки, например «показан 1 из 40». Отключён — галка видна, но не правится и не отправляется.
Три состояния ветки: включена, частично, снята
Север
2 города, снят 1Юг
1 городВосток
Показан 1 из 40
Север = Новый Массив();
Север.Добавить(Новый Структура("Имя, Подпись", "город_1", "Архангельск"));
Север.Добавить(Новый Структура("Имя, Подпись, Состояние", "город_2", "Мурманск", "выкл"));
Юг = Новый Массив();
Юг.Добавить(Новый Структура("Имя, Подпись", "город_3", "Краснодар"));
Восток = Новый Массив();
Восток.Добавить(Новый Структура("Имя, Подпись, Состояние, Отключён", "город_4", "Владивосток", "выкл", Истина));
Узлы = Новый Массив();
Узлы.Добавить(Новый Структура("Имя, Подпись, Пояснение, Состояние, Дети, Открыт",
"край_1", "Север", "2 города, снят 1", "частично", Север, Истина));
Узлы.Добавить(Новый Структура("Имя, Подпись, Пояснение, Дети", "край_2", "Юг", "1 город", Юг));
Узлы.Добавить(Новый Структура("Имя, Подпись, Состояние, Дети, Открыт, Примечание",
"край_3", "Восток", "выкл", Восток, Истина, "Показан 1 из 40"));
HTML = Набор.ДеревоГалок().Отрисовать(Новый Структура("Подпись, Узлы", "Где работаем", Узлы));Состояние ветки считает сервер по детям: кит его не выводит, а печатает то, что пришло в модели.
Что уходит на сервер#
Каждая галка — флажок формы с Имя и Значение («1» по умолчанию). Отмеченная отправляет значение, снятая — ничего. «Частично» отправляется отмеченной галкой.
Без скрипта щелчок по частичной галке снимает узел целиком, повторный возвращает прежнюю частичную отметку. Дети при этом не трогаются.
Со скриптом кита (выпуск 0.13) щелчок по галке ветки раздаёт её состояние детям, а ветки выше пересчитывают «частично» по детям. «Частично» щелчком становится «включено», как у трёхпозиционного флажка ARIA. Ветка, у которой загружены не все дети, «целиком» становится, только если так её напечатал сервер или человек сам отметил её целиком: чего на странице нет, того скрипт не знает. Дети, которые приедут в отмеченную целиком ветку, приходят её состоянием. Напечатанное сервером скрипт при загрузке не пересчитывает — состояние ветки по-прежнему считает сервер.
Данные для скрипта страницы#
Скрипт находит дерево по data-checktree, галку — по data-checktree-box, а в data-checktree-state (on, off, mixed) лежит состояние, которое напечатал сервер: скрипт кита сверяет с ним правки и его не переписывает, а текущее состояние — сама галка (checked, indeterminate). Свои признаки галки приходят полем Данные: соответствие, имена без приставки data-.
Признаки — массив моделей плашек после подписи. Одноуровневое дерево — тоже дерево: просто узлы без Детей.
Один уровень с плашками и данными для скрипта
- столица
Данные = Новый Соответствие();
Данные.Вставить("key", "город_1");
Признаки = Новый Массив();
Признаки.Добавить("столица");
Узлы = Новый Массив();
Узлы.Добавить(Новый Структура("Имя, Подпись, Признаки, Данные", "город_1", "Москва", Признаки, Данные));
Узлы.Добавить(Новый Структура("Имя, Подпись, Состояние", "город_2", "Тверь", "выкл"));
HTML = Кит.ДеревоГалок(Новый Структура("Узлы", Узлы)).Рендер();Глубина дерева ограничена четырьмя уровнями: модель приходит извне, и узел мог бы оказаться в собственных детях. Ветки глубже предела не печатаются.
Гайдлайны#
Север
Код
Дети = Новый Массив();
Дети.Добавить(Новый Структура("Имя, Подпись", "город_1", "Архангельск"));
Дети.Добавить(Новый Структура("Имя, Подпись, Состояние", "город_2", "Мурманск", "выкл"));
Узлы = Новый Массив();
Узлы.Добавить(Новый Структура("Имя, Подпись, Состояние, Дети, Открыт",
"край_1", "Север", "частично", Дети, Истина));
HTML = Набор.ДеревоГалок().Отрисовать(Новый Структура("Подпись, Узлы", "Где работаем", Узлы));Север
Код
Дети = Новый Массив();
Дети.Добавить(Новый Структура("Имя, Подпись", "город_1", "Архангельск"));
Дети.Добавить(Новый Структура("Имя, Подпись, Состояние", "город_2", "Мурманск", "выкл"));
Узлы = Новый Массив();
Узлы.Добавить(Новый Структура("Имя, Подпись, Дети, Открыт",
"край_1", "Север", Дети, Истина));
HTML = Набор.ДеревоГалок().Отрисовать(Новый Структура("Подпись, Узлы", "Где работаем", Узлы));Юг
1 город
Код
Дети = Новый Массив();
Дети.Добавить(Новый Структура("Имя, Подпись", "город_3", "Краснодар"));
Узлы = Новый Массив();
Узлы.Добавить(Новый Структура("Имя, Подпись, Пояснение, Дети", "край_2", "Юг", "1 город", Дети));
HTML = Набор.ДеревоГалок().Отрисовать(Новый Структура("Подпись, Узлы", "Где работаем", Узлы));Юг (1 город, отмечен 1)
Код
Дети = Новый Массив();
Дети.Добавить(Новый Структура("Имя, Подпись", "город_3", "Краснодар"));
Узлы = Новый Массив();
Узлы.Добавить(Новый Структура("Имя, Подпись, Дети", "край_2", "Юг (1 город, отмечен 1)", Дети));
HTML = Набор.ДеревоГалок().Отрисовать(Новый Структура("Подпись, Узлы", "Где работаем", Узлы));Восток
Показаны 2 из 40 — уточните поиском
Код
Дети = Новый Массив();
Дети.Добавить(Новый Структура("Имя, Подпись", "город_4", "Владивосток"));
Дети.Добавить(Новый Структура("Имя, Подпись", "город_5", "Хабаровск"));
Узлы = Новый Массив();
Узлы.Добавить(Новый Структура("Имя, Подпись, Дети, Открыт, Примечание",
"край_3", "Восток", Дети, Истина, "Показаны 2 из 40 — уточните поиском"));
HTML = Набор.ДеревоГалок().Отрисовать(Новый Структура("Подпись, Узлы", "Где работаем", Узлы));Восток
Код
Дети = Новый Массив();
Дети.Добавить(Новый Структура("Имя, Подпись", "город_4", "Владивосток"));
Дети.Добавить(Новый Структура("Имя, Подпись", "город_5", "Хабаровск"));
Узлы = Новый Массив();
Узлы.Добавить(Новый Структура("Имя, Подпись, Дети, Открыт",
"край_3", "Восток", Дети, Истина));
HTML = Набор.ДеревоГалок().Отрисовать(Новый Структура("Подпись, Узлы", "Где работаем", Узлы));Код
Дети = Новый Массив();
Для Номер = 1 По 60 Цикл
Дети.Добавить(Новый Структура("Имя, Подпись", "alpha-" + Формат(Номер, "ЧЦ=3; ЧВН=; ЧГ=0"),
"Участник " + Формат(Номер, "ЧГ=0")));
КонецЦикла;
Узлы = Новый Массив();
Узлы.Добавить(Новый Структура("Имя, Подпись, Дети, Всего", "alpha", "Альфа", Дети, 140));
HTML = Кит.ДеревоГалок(Узлы).Подпись("Участники проектов").Адрес("/образец-дерева/ветка").Рендер();Альфа
Показаны 60 из 140
Код
Дети = Новый Массив();
Для Номер = 1 По 60 Цикл
Дети.Добавить(Новый Структура("Имя, Подпись", "alpha-" + Формат(Номер, "ЧЦ=3; ЧВН=; ЧГ=0"),
"Участник " + Формат(Номер, "ЧГ=0")));
КонецЦикла;
Узлы = Новый Массив();
Узлы.Добавить(Новый Структура("Имя, Подпись, Дети, Примечание", "alpha", "Альфа", Дети,
"Показаны 60 из 140"));
HTML = Кит.ДеревоГалок(Узлы).Подпись("Участники проектов").Рендер();- Альфа
Код
Дети = Новый Массив();
Дети.Добавить(Новый Структура("Имя, Подпись", "alpha-001", "Анна Белых"));
Узлы = Новый Массив();
Узлы.Добавить(Новый Структура("Имя, Подпись, Режим, Дети, Всего, Открыт", "alpha", "Альфа", "все", Дети, 140, Истина));
HTML = Кит.ДеревоГалок(Узлы).Подпись("Участники проектов").Адрес("/образец-дерева/ветка").Режимы().Рендер();Код
Дети = Новый Массив();
Дети.Добавить(Новый Структура("Имя, Подпись", "alpha-001", "Анна Белых"));
Узлы = Новый Массив();
Узлы.Добавить(Новый Структура("Имя, Подпись, Дети, Всего, Открыт", "alpha", "Альфа", Дети, 140, Истина));
HTML = Кит.ДеревоГалок(Узлы).Подпись("Участники проектов").Адрес("/образец-дерева/ветка").Рендер();Доступность#
Подписьдерева уходит вaria-labelсписка: скринридер называет, что это за выбор.- Галка — настоящий флажок в
<label>с подписью узла: щелчок по тексту отмечает, пробел переключает. - «Частично» сервер печатает как
aria-checked="mixed"на отмеченной галке. Это осознанное отступление от ARIA in HTML: свойствоindeterminateставит только скрипт, а другого способа сказать «частично» у разметки нет. - Строка узла стоит в разметке после ветки, а на экране — первой. Так шеврон раскрытия идёт в порядке фокуса раньше галки, а галка не вложена в кнопку раскрытия. У шеврона скрытая подпись — имя ветки.
- Узел без
Имении неизвестноеСостояниекит не соберёт: выбор пропал бы молча. - Режим ветки — группа радиокнопок (
role="radiogroup") с именем «Режим ветки «…»»: стрелки двигают выбор движком браузера. Дети ветки в режиме «все» или «никакие» напечатаны запертыми (disabled) — скринридер слышит их состояние и «недоступно», а скрипт ещё и выводит их из порядка фокуса (inert); дети ветки «выбранные» правятся с клавиатуры. - Поле поиска стоит в области
role="search"и подписано скрытой меткой; у значка-кнопки имя «Найти». Число найденного печатается сrole="status". - «Показать ещё» — ссылка и без скрипта. Со скриптом фокус со ссылки переходит на первую новую галку, а не теряется вместе со ссылкой.
- Сводка правок печатается с
role="status": число правок скринридер слышит, не перечитывая плашки. - Плашка правки — пункт списка с крестиком «Отменить правку «…»»; когда правку сняли, фокус встаёт на соседнюю плашку, а без них — на сам узел (или на крестик его плашки в ряду отмеченного).
- Ряд отмеченного — список плашек; крестик — флажок с именем «Снять «…»» («Вернуть «…»» у снятого узла), фокус с клавиатуры виден кольцом вокруг значка, а отмеченное снятие — зачёркнутой подписью, не одним цветом.
Тысяча пунктов#
Когда пунктов тысяча, все ветки в разметке — тяжёлая страница, а форма, которая отдаёт каждую галку, — тяжёлый запрос. Четыре слова выпуска 0.13 разгружают и то, и другое; дерево без них печатается как прежде, байт в байт.
| Слово | Что делает |
|---|---|
Адрес(Адрес) |
Ветка печатает первые 50 детей (РазмерСтраницы), под ними «Показать ещё» и «Показано 50 из N»; остальные приезжают по адресу страницами по 50. Узел с Всего и без Детей — ветка, чьи дети приедут при раскрытии |
Поиск(Адрес) |
Над деревом поле «Найти в дереве» со значком-лупой внутри, как у строки поиска; ответ сервера ложится на место веток. Прежний вид — поле и кнопка рядом — словом Кнопка("Найти") |
Режимы() |
У каждой ветки вместо галки сегменты «Все / Выбранные / Никакие» |
Режимы("все", "выбранные", …) |
Набор допустимых режимов: сегменты только у них и в их порядке |
ТолькоПравки() |
Со скриптом форма отдаёт не все галки, а только правки; правки видны плашками под деревом — над кнопками формы |
ПравкиБезСкрипта() |
И без скрипта форма отдаёт правки: кит печатает скрытое поле показанного, РазобратьПравки считает правки против него |
Отмеченные(Узлы) |
Над деревом ряд «Выбрано: …» — плашки отмеченных узлов вне показанного с крестиком |
СводкаПравок() |
Под деревом, у кнопок формы, строка «Изменений: 3 (+2 −1)» по ряду правок |
У каждого узла есть ключ — по нему сервер узнаёт узел в адресе ветки и в правках. Ключ — Значение галки, если оно своё (не «1»), иначе её Имя.
Страницы ветки#
Всего у ветки — сколько у неё детей на сервере; без него — сколько их пришло в Детях. Детей больше 50 — кит печатает первые 50 и ссылку на вторую страницу. Ссылка настоящая: без скрипта она ведёт на страницу ветки, со скриптом страница приезжает запросом в фоне и дописывается в ветку, а ссылка ведёт уже на следующую. Нажмите «Показать ещё» — ответит образец с сервером.
Ветка печатает первые 50 — остальное по «Показать ещё»
- 75 участников
Дети = Новый Массив();
Для Номер = 1 По 60 Цикл
Дети.Добавить(Новый Структура("Имя, Подпись, Состояние", "alpha-" + Формат(Номер, "ЧЦ=3; ЧВН=; ЧГ=0"),
"Участник " + Формат(Номер, "ЧГ=0"), ?(Номер % 3 = 0, "выкл", "вкл")));
КонецЦикла;
Узлы = Новый Массив();
Узлы.Добавить(Новый Структура("Имя, Подпись, Состояние, Дети, Всего, Открыт",
"alpha", "Альфа", "частично", Дети, 140, Истина));
Узлы.Добавить(Новый Структура("Имя, Подпись, Пояснение, Всего", "gamma", "Гамма", "75 участников", 75));
HTML = Кит.ДеревоГалок(Узлы).Подпись("Участники проектов").Адрес("/образец-дерева/ветка").Рендер();Ветка «Гамма» пришла без детей: со скриптом они приезжают, когда её раскрывают, без скрипта под ней ссылка на первую страницу.
Режим ветки#
Режимы() ставит у ветки малые сегменты «Все / Выбранные / Никакие» — радиокнопки режим:<ключ ветки>. «Все» — вся ветка целиком, вместе с детьми, которых на странице нет: галкой ветки этого не сказать, пока загружена только часть детей. «Выбранные» — только отмеченные дети, «Никакие» — никто.
Режим берётся из поля Режим узла, а без него — из Состояния: «вкл» — «все», «выкл» — «никакие», «частично» — «выбранные».
Режим — ещё и массовая отметка (дев-сборка 10). «Все» — все дети ветки отмечены и заперты; «Никакие» — все сняты и заперты; «Выбранные» — дети отперты и начинаются с того, что было видно: переключили из «Все» — все отмечены, снимите лишних; из «Никакие» — все сняты, отметьте нужных; из «Выбранных» — как были. Ручные отметки внутри «Выбранных» живут, пока не нажато «Все» или «Никакие». Сервер печатает детей ветки «все» отмеченными, «никакие» — снятыми, и тех и других запертыми (disabled, признак data-checktree-locked): что видно, то и сохранится, и без скрипта тоже. Со скриптом переключение — на месте, и дети, которые приедут страницей позже, встают по режиму, отмеченному сейчас.
Массовая отметка — основа «выбранных»: правки детей считаются против неё, и с формой уходит основа=<ключ>:все или :никакие — сервер строит набор заново: «выбранные» после «все» — вся ветка минус снятые, после «никакие» — только отмеченные. Разложить правки одной ветки помогает ПравкиВетки (см. контракт сервера).
Сегменты режима у строки ветки — малая пилюля своей ширины и одной строкой на любой ширине, в окне и на телефоне тоже (дев-сборка 10): не помещаются рядом с подписью — строка переносит пилюлю под подпись целиком, а подписи сегментов не переносятся. Правила «во всю ширину» и «столбиком в окне» — для сегментов выбора в форме, а не для строки дерева: столбиком сегменты удлиняли бы каждую ветку втрое.
Режим ветки сегментами
Альфа
АльфаЗета
Зета
Альфа = Новый Массив();
Альфа.Добавить(Новый Структура("Имя, Подпись", "alpha-001", "Анна Белых"));
Альфа.Добавить(Новый Структура("Имя, Подпись, Состояние", "alpha-002", "Борис Седых", "выкл"));
Зета = Новый Массив();
Зета.Добавить(Новый Структура("Имя, Подпись, Состояние", "zeta-001", "Вера Шевчук", "выкл"));
Узлы = Новый Массив();
Узлы.Добавить(Новый Структура("Имя, Подпись, Состояние, Дети, Открыт", "alpha", "Альфа", "частично", Альфа, Истина));
Узлы.Добавить(Новый Структура("Имя, Подпись, Режим, Дети, Открыт", "zeta", "Зета", "все", Зета, Истина));
HTML = Кит.ДеревоГалок(Узлы).Подпись("Участники проектов").Режимы().Рендер();Массовые галки — нажмите «Все», потом «Выбранные» и снимите лишнего
Альфа
АльфаЗета
Зета
Альфа = Новый Массив();
Альфа.Добавить(Новый Структура("Имя, Подпись", "alpha-001", "Анна Белых"));
Альфа.Добавить(Новый Структура("Имя, Подпись, Состояние", "alpha-002", "Борис Седых", "выкл"));
Альфа.Добавить(Новый Структура("Имя, Подпись, Состояние", "alpha-003", "Вера Шевчук", "выкл"));
Зета = Новый Массив();
Зета.Добавить(Новый Структура("Имя, Подпись", "zeta-001", "Глеб Мельник"));
Зета.Добавить(Новый Структура("Имя, Подпись", "zeta-002", "Дарья Кравец"));
Узлы = Новый Массив();
Узлы.Добавить(Новый Структура("Имя, Подпись, Режим, Дети, Открыт", "alpha", "Альфа", "выбранные", Альфа, Истина));
Узлы.Добавить(Новый Структура("Имя, Подпись, Режим, Дети, Открыт", "zeta", "Зета", "никакие", Зета, Истина));
HTML = Кит.ДеревоГалок(Узлы).Подпись("Участники проектов").Режимы().ТолькоПравки().СводкаПравок().Рендер();Слово для других приложений — режим «Все, кроме» (Режим = "кроме", словарь checktree.mode.except): ветка целиком, кроме снятых детей, а новые дети ветки входят в неё сами. Он печатается, только если назван в наборе Режимы(…); дети его отперты и отмечены, снятая галка — исключение.
Набор режимов#
Режимы строками — набор допустимых режимов дерева: сегменты печатаются только у них и в их порядке. Своё у отдельной ветки — поле узла Режимы (массив). Ветка, чей режим в набор не входит, и неизвестный режим в наборе останавливают сборку: ни один сегмент не был бы отмечен. Режимы() без набора и набор из трёх прежних печатают одно и то же — прежнюю разметку.
Своя ветка не бывает «никакой»: набор «все / выбранные»
Альфа
Альфа
Альфа = Новый Массив();
Альфа.Добавить(Новый Структура("Имя, Подпись", "alpha-001", "Анна Белых"));
Узлы = Новый Массив();
Узлы.Добавить(Новый Структура("Имя, Подпись, Режим, Дети, Открыт", "alpha", "Альфа", "все", Альфа, Истина));
HTML = Кит.ДеревоГалок(Узлы).Подпись("Свой проект").Режимы("все", "выбранные").Рендер();Поиск через сервер#
Поиск(Адрес) ставит над деревом поле поиска той же разметкой, что строка поиска кита без кнопки (дев-сборка 8): значок-лупа — кнопка отправки внутри рамки поля, подпись поля «Найти в дереве» — скрытой меткой, а в пустом поле видна подсказка. Поиск дерева и поиск реестра на одном экране выглядят одинаково. Со скриптом значок, Enter и пауза в наборе берут ответ по адресу Адрес?найти=<строка>, и он ложится на место веток; пустое поле возвращает ветки. Без скрипта Enter и значок отправляют форму дерева на адрес поиска, не проверяя полей, и сервер отвечает страницей с ответом.
Прежний вид — поле с меткой и кнопка рядом — словом Кнопка(Подпись):
Поиск с кнопкой рядом — словом Кнопка
- 140 участников
Узлы = Новый Массив();
Узлы.Добавить(Новый Структура("Имя, Подпись, Пояснение, Всего", "alpha", "Альфа", "140 участников", 140));
HTML = Кит.ДеревоГалок(Узлы).Подпись("Участники проектов")
.Адрес("/образец-дерева/ветка").Поиск("/образец-дерева/поиск").Кнопка("Найти").Рендер();Ответ поиска — то же дерево со словом Найдено(Запрос, Всего): узлы — совпадения, над ними «По запросу «…» найдено: N» и кнопки «Включить найденные / Снять найденные». Со скриптом кнопки отмечают совпадения на месте, без скрипта отправляют форму с найденные=вкл или выкл.
Поиск над деревом — наберите «анна»
- 140 участников
- 90 участников
Узлы = Новый Массив();
Узлы.Добавить(Новый Структура("Имя, Подпись, Пояснение, Всего", "alpha", "Альфа", "140 участников", 140));
Узлы.Добавить(Новый Структура("Имя, Подпись, Пояснение, Всего", "beta", "Бета", "90 участников", 90));
HTML = Кит.ДеревоГалок(Узлы).Подпись("Участники проектов")
.Адрес("/образец-дерева/ветка").Поиск("/образец-дерева/поиск").Рендер();Ответ поиска — его печатает сервер
По запросу «анна» найдено: 2
- Альфа
- Бета
Узлы = Новый Массив();
Узлы.Добавить(Новый Структура("Имя, Подпись, Пояснение", "alpha-001", "Анна Белых", "Альфа"));
Узлы.Добавить(Новый Структура("Имя, Подпись, Пояснение, Состояние", "beta-019", "Анна Мельник", "Бета", "выкл"));
HTML = Кит.ДеревоГалок(Узлы).Подпись("Найденные участники").Поиск("/образец-дерева/поиск")
.Найдено("анна", 2).Рендер();Только правки#
ТолькоПравки() — форма отдаёт не все галки, а только то, что человек поменял против напечатанного сервером. Скрипт копит правки и показывает их плашками под деревом («+ Анна Белых», «− Борис Седых», «Альфа: Все»); любую можно снять крестиком — узел вернётся к тому, что напечатал сервер. Правка ветки покрывает правки её детей того же рода: «+ Альфа» уже говорит, что включены и все её участники. Без скрипта ряд правок спрятан, и форма отдаёт галки, как обычно.
Правки плашками — отметьте участника или смените режим
Альфа
Альфа
Альфа = Новый Массив();
Альфа.Добавить(Новый Структура("Имя, Подпись", "alpha-001", "Анна Белых"));
Альфа.Добавить(Новый Структура("Имя, Подпись, Состояние", "alpha-002", "Борис Седых", "выкл"));
Узлы = Новый Массив();
Узлы.Добавить(Новый Структура("Имя, Подпись, Состояние, Дети, Открыт", "alpha", "Альфа", "частично", Альфа, Истина));
HTML = Кит.ДеревоГалок(Узлы).Подпись("Участники проектов").Режимы().ТолькоПравки().Рендер();СводкаПравок() ставит под деревом, у кнопок формы, строку «Изменений: 3 (+2 −1)»: сколько правок уйдёт на сервер и сколько из них включает и снимает. Считает её скрипт по тем же плашкам, что в ряду правок (правка ветки, покрывшая детей, — одна); без правок и без скрипта строка спрятана. Тексты — ключи словаря checktree.changes и checktree.changes.split.
Сводка правок у кнопок формы — отметьте участника
Альфа
Альфа
Альфа = Новый Массив();
Альфа.Добавить(Новый Структура("Имя, Подпись", "alpha-001", "Анна Белых"));
Альфа.Добавить(Новый Структура("Имя, Подпись, Состояние", "alpha-002", "Борис Седых", "выкл"));
Узлы = Новый Массив();
Узлы.Добавить(Новый Структура("Имя, Подпись, Режим, Дети, Открыт", "alpha", "Альфа", "выбранные", Альфа, Истина));
HTML = Кит.ДеревоГалок(Узлы).Подпись("Участники проектов").Режимы()
.ТолькоПравки().СводкаПравок().Рендер();Всё вместе и с настоящим сервером — образец дерева на 440 участников: ветки страницами, ленивая ветка, поиск, режимы и отправка правок со сводкой того, что пришло.
Отмеченное вне показанного#
Без скрипта форма знает только показанные галки: первые 50 ветки или найденное. Отмеченный участник на третьей странице ветки не виден и не снимается, пока его не найдёшь. Слово Отмеченные(Узлы) — модели узлов (Имя, Значение, Подпись), которых на странице нет, — печатает над деревом ряд «Выбрано: …»: плашка на узел с крестиком. Подпись ряда — вторым аргументом, по умолчанию ключ словаря checktree.picked.
Крестик — настоящая галка формы снять=<ключ>, а не кнопка отправки: без скрипта щелчок зачёркивает плашку, и снятие уходит с формой, когда её сохранят. Узел с Состояние = "выкл" (снятый) печатается своим видом, и его крестик — включить=<ключ>. Со скриптом у дерева ТолькоПравки() крестик становится правкой в общем ряду правок того же дерева — «− Участник 57», — и её можно снять там же; двойник узла, если страница ветки его уже привезла, встаёт так же.
Три отмеченных дальше первой страницы — над деревом
Дети = Новый Массив();
Для Номер = 1 По 50 Цикл
Дети.Добавить(Новый Структура("Имя, Подпись, Состояние", "alpha-" + Формат(Номер, "ЧЦ=3; ЧВН=; ЧГ=0"),
"Участник " + Формат(Номер, "ЧГ=0"), "выкл"));
КонецЦикла;
Узлы = Новый Массив();
Узлы.Добавить(Новый Структура("Имя, Подпись, Режим, Дети, Всего", "alpha", "Альфа", "выбранные", Дети, 140));
Отмеченные = Новый Массив();
Для Каждого Номер Из СтрРазделить("57,93,128", ",") Цикл
Отмеченные.Добавить(Новый Структура("Имя, Подпись", "alpha-" + Номер, "Участник " + Номер));
КонецЦикла;
HTML = Кит.ДеревоГалок(Узлы).Подпись("Участники проектов").Адрес("/образец-дерева/ветка")
.Режимы().ТолькоПравки().Отмеченные(Отмеченные).Рендер();Отмеченного вне показанного бывает сотни — у ветки «выбранные» на тысячу участников. Слово ПределОтмеченных(Предел, Всего, Адрес) (дев-сборка 10) печатает первые Предел плашек, а остальное — хвостом «ещё N» (ключ словаря checktree.picked.more): ссылкой на продолжение у приложения, если дан Адрес, иначе текстом. Всего — сколько отмеченных на сервере, если в Отмеченные пришла только первая порция. Плашки за хвостом с формой не уходят и остаются как есть.
Ряд отмеченного с пределом — первые три и «ещё»
- Альфа
Узлы = Новый Массив();
Узлы.Добавить(Новый Структура("Имя, Подпись, Режим, Всего", "alpha", "Альфа", "выбранные", 140));
Отмеченные = Новый Массив();
Для Каждого Номер Из СтрРазделить("57,93,128", ",") Цикл
Отмеченные.Добавить(Новый Структура("Имя, Подпись", "alpha-" + Номер, "Участник " + Номер));
КонецЦикла;
HTML = Кит.ДеревоГалок(Узлы).Подпись("Участники проектов").Адрес("/образец-дерева/ветка").Режимы()
.Отмеченные(Отмеченные).ПределОтмеченных(3, 42, "/образец-получателей").Рендер();Правки без скрипта#
Без скрипта форма знает только показанные галки и отдаёт их как есть: отмеченные — значением, снятые — ничем. Чтобы понять, что человек поменял, приложению пришлось бы сравнивать форму с тем, что оно напечатало. Слово ПравкиБезСкрипта() делает это за него: кит печатает в конце дерева скрытое поле показано (data-checktree-shown) — какие галки и режимы он показал и в каком состоянии, — и РазобратьПравки без скрипта отдаёт правки против него, как со скриптом: снятую показанную галку — в Снять, отмеченную снятую — в Включить, сменённый режим — в Режимы (несменённых там нет). Закрытая галка (Отключён) в форму не уходит и в показанное не входит. «Частично», оставленное отмеченным, правкой не считается.
Со скриптом поле пересчитывается при отправке — по всем галкам обёртки: страницы веток и найденное, приехавшие запросом, в нём тоже есть. У дерева ТолькоПравки() скрипт шлёт правки сам, и поле не уходит.
Поле показанного — в конце дерева
Альфа
Альфа
Альфа = Новый Массив();
Альфа.Добавить(Новый Структура("Имя, Подпись", "alpha-001", "Анна Белых"));
Альфа.Добавить(Новый Структура("Имя, Подпись, Состояние", "alpha-002", "Борис Седых", "выкл"));
Узлы = Новый Массив();
Узлы.Добавить(Новый Структура("Имя, Подпись, Режим, Дети, Открыт", "alpha", "Альфа", "выбранные", Альфа, Истина));
HTML = Кит.ДеревоГалок(Узлы).Подпись("Участники проектов").Режимы()
.ТолькоПравки().ПравкиБезСкрипта().Рендер();Без скрипта#
- Каждая ветка печатает первые 50 детей, «Показать ещё» — обычная ссылка на страницу ветки.
- Значок поиска (и Enter в поле) — кнопка отправки формы на адрес поиска; ответ поиска — страница, где на месте веток совпадения.
- Крестик плашки отмеченного — галка
снять=<ключ>(включить=<ключ>у снятого узла): уходит с формой. - Режим ветки — радиокнопки
режим:<ключ>со значениемвсе,выбранныеилиникакие(кроме— если назван в наборе). Дети ветки «все» и «никакие» напечатаны состоянием режима и заперты: смена сегмента уходит с формой, и сервер печатает ветку заново — «выбранные» после «все» засеяны отмеченными, после «никакие» — снятыми (основу кит выводит из показанного режима, см.ПравкиВетки). - Форма уходит обычной отправкой галок: каждая показанная отмеченная галка —
Имя=Значение. Чего на странице не было, того в форме нет: сервер знает, что показывал, — первые 50 каждой ветки или совпадения поиска (строка поиска приходит полемнайти).
Контракт сервера#
Скрипт ничего не решает за сервер: он берёт те же адреса, что ссылки и кнопки без скрипта, и ищет в ответе признаки кита. Ответ может быть страницей целиком — скрипт возьмёт из неё нужный кусок, а без скрипта человек увидит эту страницу.
Страница ветки. Запрос — GET Адрес?ветка=<ключ ветки>&страница=<N> (у корня дерева — без ветка), N с единицы. Ответ — HTML (text/html, код 200), в котором есть список data-checktree-page="<ключ ветки>": его узлы li.checktree__node скрипт дописывает в ветку, пропуская те, чей ключ в ветке уже есть. Строка data-checktree-more="<ключ ветки>" из ответа встаёт на место прежней «Показать ещё»; нет её — показано всё. Напечатать такой ответ — то же дерево со словом Ветка(Ключ, Страница, Всего): узлы — дети ветки на этой странице.
// GET /образец-дерева/ветка?ветка=alpha&страница=2
Страница = Кит.ДеревоГалок(УчастникиСтраницы(Проект, Номер))
.Подпись(Проект.Подпись).Адрес("/образец-дерева/ветка")
.Ветка(Проект.Ключ, Номер, Проект.Всего);
Ответ.ТелоТекст = Каркас.Страница("Участники проекта", Страница, Контекст);
Страница ветки — ответ адреса веток
Показать ещёПоказано 53 из 140
Дети = Новый Массив();
Для Номер = 51 По 53 Цикл
Дети.Добавить(Новый Структура("Имя, Подпись", "alpha-" + Формат(Номер, "ЧЦ=3; ЧВН=; ЧГ=0"),
"Участник " + Формат(Номер, "ЧГ=0")));
КонецЦикла;
HTML = Кит.ДеревоГалок(Дети).Подпись("Альфа").Адрес("/образец-дерева/ветка").Ветка("alpha", 2, 140).Рендер();Страница ветки без скрипта (дев-сборка 10). Без скрипта человек видит ответ адреса веток страницей — вместо дерева. У дерева с режимами назовите режим ветки четвёртым аргументом: Ветка(Ключ, Страница, Всего, Режим). Тогда страница печатается целиком: строка ветки с её сегментами режима (те же радиокнопки режим:<ключ>, что в дереве), дети «все» и «никакие» — запертыми его состоянием, над ними ряд отмеченного (Отмеченные), под ними ряд и сводка правок и поле показано — в той же обёртке data-checktree-set. Положите её в ту же форму, что дерево: смена режима и галки уйдут, как из дерева. Скрипт, когда берёт страницу запросом, по-прежнему забирает из неё только список детей. Ответит образец получателей.
Страница ветки с режимом — и без скрипта
Дети = Новый Массив();
Для Номер = 51 По 53 Цикл
Дети.Добавить(Новый Структура("Имя, Подпись", "epsilon-" + Формат(Номер, "ЧЦ=3; ЧВН=; ЧГ=0"),
"Участник " + Формат(Номер, "ЧГ=0")));
КонецЦикла;
HTML = Кит.ДеревоГалок(Дети).Подпись("Эпсилон").Адрес("/образец-получателей/ветка").Режимы()
.Ветка("epsilon", 2, 120, "никакие").ТолькоПравки().ПравкиБезСкрипта().СводкаПравок().Рендер();Ответ поиска. Запрос со скриптом — GET Поиск?найти=<строка>; без скрипта — отправка формы дерева на адрес поиска (POST, строка поиска — полем найти, остальные поля формы рядом). Ответ — HTML, в котором есть блок data-checktree-found: скрипт кладёт его на место веток. Напечатать — дерево совпадений со словом Найдено(Запрос, Всего) и словом Поиск, чтобы без скрипта поле помнило строку; ничего не нашлось — то же слово и пустой массив узлов.
Отправка формы. Со скриптом и ТолькоПравки() галки и радиокнопки режимов дерева в форму не уходят; вместо них приходят поля:
| Поле | Значение |
|---|---|
правки |
1 — форма прислала правки, а не галки; приходит и тогда, когда правок нет |
включить |
ключ узла, который включили; по полю на узел |
снять |
ключ узла, который сняли; по полю на узел |
режим |
<ключ ветки>:<режим> — режим, который сменили |
основа |
<ключ ветки>:все или :никакие — «выбранные» начаты массовой отметкой (дев-сборка 10): набор ветки — основа плюс включить и минус снять |
Имена этих полей — контракт формы; их отдаёт Кит.ИменаПолейДерева() (ДеревоГалок.ИменаПолей(), дев-сборка 10): Правки, Включить, Снять, Режим, ПриставкаРежима (режим: у радиокнопок), Основа, Показано, Найти, Найденные. Сторожам приложения строки повторять не нужно.
Без скрипта приходят галки (Имя=Значение показанных отмеченных), радиокнопки режимов режим:<ключ>=<режим>, строка поиска найти и, если нажали, найденные=вкл или выкл; со словом ПравкиБезСкрипта() — и поле показано: перечень через запятую, +ключ, -ключ, ~ключ — галка, напечатанная включённой, снятой или «частично», =ключ:режим — режим ветки (запятая и процент в ключе — %2C и %25). Ветка, которую включили или сняли целиком, приходит своей правкой и правками загруженных детей; детей, которых скрипт не загружал, в правках нет — «всю ветку» говорит режим «все».
Правок одного имени приходит несколько, поэтому тело разбирают строкой: Кит.РазобратьПравкиДерева(Тело) (то же, что ДеревоГалок.РазобратьПравки; словами кита с дев-сборки 10 — прежний вход НаборКомпонентов для этого не нужен, как и для Кит.РазмерСтраницыДерева()) отдаёт Правки (Булево), Включить и Снять (массивы ключей), Режимы (соответствие: ключ ветки — режим) — режимы в обоих видах, со скриптом и без, — Показанные (ключи из поля показано; пришло оно без правки=1 — Включить, Снять и Режимы посчитаны против него) и Основы (ключ ветки — «все» | «никакие»: от чего начались «выбранные»; без скрипта кит выводит основу из показанного режима). Кит.ПравкиВеткиДерева(Разбор, КлючВетки, КлючиДетей) (ДеревоГалок.ПравкиВетки) раскладывает правки одной ветки: Режим (новый, "" — не меняли), БылРежим (основа), Включённые, Снятые — только её детей; у режима «все» и «никакие» правок детей нет.
Итог = Кит.РазобратьПравкиДерева(ТелоЗапроса);
Если Итог.Правки ИЛИ Итог.Показанные.Количество() > 0 Тогда
// поменять только то, что пришло: Итог.Включить, Итог.Снять, Итог.Режимы
Ветка = Кит.ПравкиВеткиДерева(Итог, "alpha", КлючиУчастников("alpha"));
Если Ветка.Режим = "все" ИЛИ Ветка.Режим = "никакие" Тогда
// весь проект | никого
ИначеЕсли Ветка.БылРежим = "все" Тогда
// все участники минус Ветка.Снятые
ИначеЕсли Ветка.БылРежим = "никакие" Тогда
// только Ветка.Включённые
Иначе
// хранимый выбор плюс Ветка.Включённые минус Ветка.Снятые
КонецЕсли;
Иначе
// без скрипта: показанные галки целиком, режимы — в Итог.Режимы
КонецЕсли;
Узлом холста#
На холсте дерево кладут в форму — Кит.ДеревоГалок(Узлы): узлы массивом первым аргументом, подпись — словом .Подпись(…), узел по одному — словом .Узел(…). Прежний вход со структурой-моделью (Кит.ДеревоГалок(Новый Структура("Узлы", …))) работает как раньше. Примеры узлом — выше на странице.
Модель#
Поля модели — из комментария в исходнике компонента. Слова узла пишут те же поля: Подпись, Узел, Адрес, Поиск, Кнопка, Режимы, ТолькоПравки, ПравкиБезСкрипта, Отмеченные, СводкаПравок, Найдено, Ветка.
Кит.ДеревоГалок()src/Классы/холст/Кит.os
Дерево галок — выбор по дереву с трёхпозиционной галкой у ветки; кладётся в форму.
Слова: Подпись (доступное имя дерева), Узел(Модель узла) — добавляет узел в корень;
дерево на тысячу пунктов (выпуск 0.13): Адрес(Адрес веток) — ветка печатает первые 50
детей, остальные приезжают по адресу страницами («Показать ещё»), Поиск(Адрес) — поле
поиска над деревом со значком в поле и адрес ответа (с кнопкой рядом — словом
Кнопка(Подпись)), Режимы() — сегменты «все / выбранные / никакие»
у ветки, ТолькоПравки() — форма отдаёт правки, а не все галки; ответы сервера —
Найдено(Запрос, Всего) (ответ поиска) и Ветка(Ключ, Страница, Всего) (страница ветки).
Дев-сборка 8: Режимы("все", "кроме", …) — набор допустимых режимов с четвёртым «кроме»
(все, кроме снятых детей), ПравкиБезСкрипта() — без скрипта форма тоже отдаёт правки.
Параметры:
Модель - Массив, Структура - (необязательный) узлы дерева либо модель компонента
«Дерево галок» (прежний вид модели).
Возвращаемое значение:
ЭлементЭкранаДеревоГалок.Отрисовать()src/Классы/компоненты/ДеревоГалок.os
Отрисовывает дерево галок.
Параметры:
Модель - Структура - Подпись (доступное имя дерева), Узлы (Массив из Структура):
* Имя - Строка - имя галки в форме (обязательно);
* Значение - Строка - что галка отправляет отмеченной (по умолчанию "1");
* Подпись - Строка - что за узел;
* Пояснение - Строка - приглушённая приписка после подписи;
* Признаки - Массив - модели плашек после подписи;
* Состояние - Строка - "вкл" | "выкл" | "частично"; «частично» отправляется
отмеченной галкой;
* Отключён - Булево - галка не отправляется и не правится;
* Дети - Массив из Структура - узлы ветки той же формы; есть ключ — узел ветка,
даже пустая;
* Открыт - Булево - ветка приезжает раскрытой;
* Примечание - Строка - строка в конце ветки (что показано не всё и т. п.);
* Данные - Соответствие - дополнительные data-атрибуты галки для скрипта страницы
(имя без приставки data-);
* Всего - Число - (выпуск 0.13) сколько детей у ветки на сервере; больше
напечатанных — под ветвью «Показать ещё». С Адресом узел с Всего > 0 — ветка и без
Детей: её дети приедут при раскрытии;
* Режим - Строка - (выпуск 0.13) "все" | "выбранные" | "никакие" — режим ветки при
Режимах; по умолчанию из Состояния: вкл — все, выкл — никакие, частично — выбранные.
Дев-сборка 8: "кроме" — все, кроме снятых детей: дети правятся, как в «выбранных»,
снятая галка — исключение, а новые дети ветки на сервере входят в неё сами;
* Режимы - Массив из Строка - (дев-сборка 8) режимы, допустимые у этой ветки: сегменты
печатаются только у них, в их порядке; по умолчанию — режимы дерева.
Поля модели выпуска 0.13 (любое из них печатает дерево в обёртке data-checktree-set):
* Адрес - Строка - адрес страниц веток: ветка печатает первые 50 детей
(РазмерСтраницы), «Показать ещё» ведёт на Адрес?ветка=<ключ>&страница=<N>
(у корня — без «ветка»), и скрипт дописывает страницу в ветку;
* Всего - Число - сколько узлов в корне на сервере (страницы корня — как у ветки);
* Поиск - Строка - адрес поиска: над деревом поле «найти» со значком-лупой внутри,
как у строки поиска кита (дев-сборка 8; подпись поля — скрытой меткой); скрипт берёт
Поиск?найти=<строка> и кладёт ответ (data-checktree-found) на место веток; без
скрипта Enter и значок отправляют форму на этот адрес;
* Кнопка - Строка - (дев-сборка 8) подпись кнопки поиска: с ней — прежний вид, поле
с меткой и кнопка рядом;
* Режимы - Булево, Массив из Строка - у каждой ветки сегменты «все / выбранные /
никакие» (радиокнопки «режим:<ключ>») вместо галки ветки. Массив (дев-сборка 8) —
допустимые режимы в порядке сегментов, из «все», «выбранные», «никакие», «кроме»;
* ПравкиБезСкрипта - Булево - (дев-сборка 8) кит печатает скрытое поле «показано» —
ключи показанных галок и режимов с тем, что напечатал сервер, — и РазобратьПравки
без скрипта отдаёт правки против напечатанного, как со скриптом;
* Отмеченные - Массив из Структура - (дев-сборка 8) отмеченные узлы вне показанного
(Имя, Значение, Подпись, Состояние — «вкл» по умолчанию или «выкл»): над деревом ряд
«Выбрано: …» плашками с крестиком. Крестик — галка формы «снять=<ключ>» (у снятого
узла — «включить=<ключ>»), со скриптом — правка в общем ряду правок дерева;
* ПодписьОтмеченных - Строка - (дев-сборка 8) подпись ряда отмеченных вместо «Выбрано»;
* ПределОтмеченных - Число - (дев-сборка 10) сколько плашек ряда отмеченных печатать:
остальные — хвостом «ещё N» (словарь checktree.picked.more); 0 — все, как прежде;
* ВсегоОтмеченных - Число - (дев-сборка 10) сколько отмеченных вне показанного на
сервере, если в Отмеченные пришла только первая порция; по умолчанию — их число;
* АдресОтмеченных - Строка - (дев-сборка 10) куда ведёт хвост «ещё N» — продолжение
ряда у приложения (страница отмеченного); пусто — хвост текстом;
* СводкаПравок - Булево - (дев-сборка 8) под деревом, у кнопок формы, строка «Изменений:
N (+a −b)» по ряду правок; её пишет скрипт, без скрипта она спрятана;
* ТолькоПравки - Булево - со скриптом форма отдаёт не галки, а правки: правки=1,
включить=<ключ>, снять=<ключ>, режим=<ключ>:<режим>; правки видны плашками под
деревом, любую можно снять. Без скрипта уходят галки, как обычно;
* Найдено - Строка - дерево — ответ поиска по этой строке: Узлы — совпадения,
над ними число найденного и кнопки «Включить / Снять найденные»;
* Ветка, Страница - Строка, Число - дерево — фрагмент: страница Страница (с 1)
детей ветки с этим ключом ("" — корня), без обёртки и поиска;
* РежимВетки - Строка - (дев-сборка 10) у фрагмента: режим ветки, чьи дети на странице.
Страница ветки тогда печатается целиком и без скрипта: строка ветки с сегментами
режима (те же радиокнопки «режим:<ключ>»), дети «все»/«никакие» — запертыми его
состоянием, ряд отмеченного (Отмеченные), ряд и сводка правок, поле «показано» —
в обёртке data-checktree-set; скрипт берёт из неё только список детей.
Ключ узла — его Значение, если оно своё (не "1"), иначе Имя: по ключу сервер узнаёт
узел в адресе ветки и в правках.
Возвращаемое значение:
Строка - фрагмент ul.checktree либо "" для пустого списка узлов (с полями 0.13 —
div.checktree-set, у фрагмента — ul с data-checktree-page). Кидается
исключением, если у узла нет Имени, Состояние не из трёх, Режим неизвестен
или не входит в допустимые режимы ветки.ДеревоГалок.РазмерСтраницы()src/Классы/компоненты/ДеревоГалок.os
Сколько детей печатает ветка за раз (с Адресом): столько же сервер отдаёт на одной странице ветки. Возвращаемое значение: Число
ДеревоГалок.РазобратьПравки()src/Классы/компоненты/ДеревоГалок.os
Разбирает правки дерева из тела формы. Тело — строкой (application/x-www-form-urlencoded):
правок одного имени приходит несколько, а соответствие оставило бы одну. Режимы веток
разбираются в обоих видах: правкой «режим=<ключ>:<режим>» (со скриптом) и радиокнопкой
«режим:<ключ>=<режим>» (без скрипта). Чужие режимы отбрасываются: тело пришло извне.
Дев-сборка 8: дерево со словом ПравкиБезСкрипта печатает поле «показано» — что сервер
показал и как. Пришло оно без «правки=1» (форма ушла без скрипта) — правки считает кит:
показанная галка, которую сняли, — в Снять, которую отметили, — в Включить, режим, который
сменили, — в Режимах, а несменённых режимов там нет. Приложению сравнивать с напечатанным
не нужно. Поле пришло извне, но правки — это «поставить» и «снять», а не «переключить»:
подделка поля ничего, кроме того же выбора, не сделает.
Параметры:
Тело - Строка - сырое тело запроса.
Дев-сборка 10 (три режима с массовыми галками): «выбранные», начатые от «все» или
«никакие», несут основу — с чего начали галки детей: «основа=<ключ>:все» со скриптом,
а без скрипта основу кит выводит сам — из режима, который сервер показал (поле «показано»).
Тогда набор ветки — основа плюс Включить и минус Снять, см. ПравкиВетки.
Возвращаемое значение:
Структура - Правки (Булево — форма прислала правки, а не галки: пришло «правки=1»),
Включить и Снять (Массив из Строка — ключи узлов), Режимы (Соответствие:
ключ ветки — "все" | "выбранные" | "никакие" | "кроме"), Показанные
(дев-сборка 8; Массив из Строка — ключи показанных узлов из поля «показано»;
пришли без «правки=1» — Включить, Снять и Режимы посчитаны против них),
Основы (дев-сборка 10; Соответствие: ключ ветки — "все" | "никакие" — от чего
начались галки «выбранных»).ДеревоГалок.ПравкиВетки()src/Классы/компоненты/ДеревоГалок.os
Правки одной ветки (дев-сборка 10, три режима с массовыми галками) — из разбора
РазобратьПравки: что сервер делает с набором ветки.
* Режим «все» | «никакие» — весь пул | никого; Включённые и Снятые пусты (дети решены
режимом, их правки отброшены).
* БылРежим «все» — «выбранные» начаты со всех: набор = все дети ветки минус Снятые.
* БылРежим «никакие» — начаты с пустого: набор = Включённые.
* БылРежим "" — хранимый набор плюс Включённые минус Снятые (режим не меняли или сменили
без массовой отметки).
Параметры:
Разбор - Структура - результат РазобратьПравки.
КлючВетки - Строка - ключ ветки.
КлючиДетей - Массив из Строка, Соответствие, Неопределено - (необязательный) ключи детей
ветки: Включённые и Снятые берутся только из них; Неопределено — все правки.
Возвращаемое значение:
Структура - Режим (новый режим ветки; "" — не меняли), БылРежим ("все" | "никакие" | ""),
Включённые, Снятые (Массив из Строка).Кит.РазобратьПравкиДерева()src/Классы/холст/Кит.os
Разбор правок дерева галок из тела формы — то же, что ДеревоГалок.РазобратьПравки. Параметры: Тело - Строка - сырое тело запроса (application/x-www-form-urlencoded). Возвращаемое значение: Структура - Правки, Включить, Снять, Режимы, Показанные, Основы, см. ДеревоГалок.РазобратьПравки.
Кит.ПравкиВеткиДерева()src/Классы/холст/Кит.os
Правки одной ветки дерева галок — то же, что ДеревоГалок.ПравкиВетки. Параметры: Разбор - Структура - результат РазобратьПравкиДерева. КлючВетки - Строка - ключ ветки. КлючиДетей - Массив из Строка, Соответствие, Неопределено - (необязательный) ключи детей ветки. Возвращаемое значение: Структура - Режим, БылРежим, Включённые, Снятые, см. ДеревоГалок.ПравкиВетки.
Кит.РазмерСтраницыДерева()src/Классы/холст/Кит.os
Сколько детей ветка дерева галок печатает за раз — столько же сервер отдаёт на одной странице ветки (ДеревоГалок.РазмерСтраницы). Возвращаемое значение: Число
Кит.ИменаПолейДерева()src/Классы/холст/Кит.os
Имена полей формы дерева галок — то же, что ДеревоГалок.ИменаПолей (дев-сборка 10). Возвращаемое значение: ФиксированнаяСтруктура - Правки, Включить, Снять, Режим, ПриставкаРежима, Основа, Показано, Найти, Найденные, см. ДеревоГалок.ИменаПолей.
ЭлементЭкрана.Узел()src/Классы/холст/ЭлементЭкрана.os
Узел дерева галок: добавляет узел в корень дерева.
Параметры:
Модель_ - Структура - модель узла: Имя, Подпись, Состояние, Дети и прочие поля узла
компонента «Дерево галок».
Возвращаемое значение:
ЭлементЭкрана - этот же элемент.ЭлементЭкрана.Поиск()src/Классы/холст/ЭлементЭкрана.os
Поиск над деревом галок: поле «найти» со значком-лупой внутри — разметкой строки поиска кита (дев-сборка 8); прежний вид, поле и кнопка «Найти» рядом, — словом Кнопка(Подпись). Скрипт берёт ответ по адресу Адрес?найти=<строка> и кладёт его на место веток; без скрипта Enter и значок отправляют форму на этот адрес. Параметры: Адрес_ - Строка - адрес ответа поиска (относительный адрес своего приложения). Возвращаемое значение: ЭлементЭкрана - этот же элемент.
ЭлементЭкрана.Режимы()src/Классы/холст/ЭлементЭкрана.os
Режимы веток дерева галок: у каждой ветки вместо галки сегменты «все / выбранные /
никакие» — радиокнопки «режим:<ключ ветки>». Дев-сборка 8: режимы строками — набор
допустимых режимов дерева, сегменты печатаются только у них и в их порядке; четвёртый
режим «кроме» — все, кроме снятых детей: дети правятся, снятая галка — исключение.
Свой набор у ветки — поле узла Режимы (массив).
Параметры:
Флаг - Булево, Строка, Массив из Строка - (необязательный) ставить ли режимы; строка или
массив — первый допустимый режим или весь набор: "все", "выбранные", "никакие",
"кроме".
Р2…Р4 - Строка - (необязательные) следующие допустимые режимы.
Возвращаемое значение:
ЭлементЭкрана - этот же элемент.ЭлементЭкрана.ТолькоПравки()src/Классы/холст/ЭлементЭкрана.os
Форма дерева галок отдаёт только правки: со скриптом вместо галок уходят правки=1, включить=<ключ>, снять=<ключ>, режим=<ключ>:<режим>, а правки видны плашками под деревом. Без скрипта уходят галки, как обычно. Параметры: Флаг - Булево - (необязательный) отдавать ли только правки. Возвращаемое значение: ЭлементЭкрана - этот же элемент.
ЭлементЭкрана.ПравкиБезСкрипта()src/Классы/холст/ЭлементЭкрана.os
Без скрипта форма дерева галок тоже отдаёт правки: кит печатает скрытое поле «показано» (что сервер показал и как), и РазобратьПравки отдаёт Включить, Снять и сменённые Режимы против напечатанного — приложению не нужно сравнивать с ним само. Со скриптом поле пересчитывается при отправке по всем галкам на странице. Обычно — вместе с ТолькоПравки. Параметры: Флаг - Булево - (необязательный) печатать ли поле показанного. Возвращаемое значение: ЭлементЭкрана - этот же элемент.
ЭлементЭкрана.Отмеченные()src/Классы/холст/ЭлементЭкрана.os
Отмеченное вне показанного: над деревом галок ряд «Выбрано: …» — плашки отмеченных узлов,
которых на странице нет (дальше первой страницы ветки, вне найденного), с крестиком. Без
скрипта крестик — галка формы «снять=<ключ>» (у снятого узла — «включить=<ключ>»): плашка
зачёркивается, снятие уходит с формой; со скриптом — правка в общем ряду правок дерева.
Параметры:
Узлы - Массив из Структура, Структура - модели узлов (Имя, Значение, Подпись, Состояние)
либо один узел; повторный вызов дописывает.
Подпись_ - Строка - (необязательный) подпись ряда вместо «Выбрано».
Возвращаемое значение:
ЭлементЭкрана - этот же элемент.ЭлементЭкрана.ПределОтмеченных()src/Классы/холст/ЭлементЭкрана.os
Предел ряда отмеченного вне показанного (дев-сборка 10, ui-получатели-2 П1): ряд печатает
первые Предел плашек, остальное — хвостом «ещё N» (словарь checktree.picked.more), ссылкой
на продолжение у приложения, если дан Адрес. Плашки за хвостом с формой не уходят.
Параметры:
Предел - Число - сколько плашек печатать; 0 — все.
Всего - Число - (необязательный) сколько отмеченных на сервере, если в Отмеченные пришла
только первая порция; по умолчанию — сколько пришло.
Адрес - Строка - (необязательный) куда ведёт хвост — страница отмеченного у приложения.
Возвращаемое значение:
ЭлементЭкрана - этот же элемент.ЭлементЭкрана.СводкаПравок()src/Классы/холст/ЭлементЭкрана.os
Сводка правок дерева галок: под деревом, у кнопок формы, строка «Изменений: 3 (+2 −1)» — сколько правок уйдёт на сервер. Пишет её скрипт по ряду правок (ТолькоПравки); без скрипта правок нет, и строки не видно. Параметры: Флаг - Булево - (необязательный) печатать ли сводку. Возвращаемое значение: ЭлементЭкрана - этот же элемент.
ЭлементЭкрана.Найдено()src/Классы/холст/ЭлементЭкрана.os
Дерево галок — ответ поиска: узлы — совпадения, над ними число найденного и кнопки
«Включить / Снять найденные».
Параметры:
Запрос - Строка - что искали.
Всего_ - Число - (необязательный) сколько совпадений на сервере, если узлов передано
меньше.
Возвращаемое значение:
ЭлементЭкрана - этот же элемент.ЭлементЭкрана.Ветка()src/Классы/холст/ЭлементЭкрана.os
Дерево галок — страница ветки: ответ адреса веток. Узлы — дети ветки на этой странице.
Параметры:
Ключ_ - Строка - ключ ветки из запроса («ветка=»); "" — корень дерева.
Страница_ - Число - (необязательный) номер страницы из запроса («страница=»), с 1.
Всего_ - Число - (необязательный) сколько детей у ветки на сервере.
Режим_ - Строка - (необязательный, дев-сборка 10) режим ветки: страница ветки
печатается целиком и без скрипта — строка ветки с сегментами режима, дети
«все»/«никакие» заперты его состоянием, ряд отмеченного (Отмеченные), ряд
и сводка правок, поле «показано»; скрипт берёт из неё только список детей.
Возвращаемое значение:
ЭлементЭкрана - этот же элемент.