Diskmobile 26.600.0: выбираем папку для перемещения и копирования
В мобильном Диске 26.600.0 файл можно переместить или скопировать в любую папку любого доступного диска, не выходя из приложения. Ещё мобильный клиент научился открывать HTML-файлы по единой ссылке. Серверная часть выбора папки описана в разборе Disk 26.1500.0, здесь — что видит пользователь и что получают разработчики мобильных расширений.
Новое
Перемещайте и копируйте в любую папку
Новое окно выбора назначения переключает диски, показывает путь, ищет папки в выбранном хранилище и умеет создать папку прямо на месте. Открыть можно и папку, куда класть файл нельзя: подходящее место может оказаться глубже. Кнопка подтверждения активна, только когда сервер ответил allowed, а создать папку разрешено при folder.rights.canAdd === true. Диски с ограничением видны в списке с пояснением, но выбрать их нельзя.
Перемещение доступно при праве rights.canMarkDeleted на адресуемом объекте. Копированию право удаления не нужно: достаточно, чтобы объект был исходным (id === realObjectId) и адресуемым. В режиме единой ссылки работает прежний сценарий копирования с проверкой rights.canAdd === true. Окончательно права проверяет серверный модуль Disk.
Если в папке назначения уже есть файл с таким именем, приложение спросит, сохранить оба или отменить операцию. После успеха уведомление предлагает перейти в папку. Перемещение может вернуть объекту новый ID: тогда клиент убирает старую запись из списка и загружает новую вместе с правами.
Встройте выбор папки в своё расширение
Корневой disk/destination-picker экспортирует openDestinationPicker({ objectId, operation, context, parentWidget, order }). Функция сама открывает окно и выполняет move или copy, но ничего не возвращает, так что дождаться результата через неё нельзя. Параметр order она принимает, но не использует.
jn.define('my/files/actions', (require, exports, module) => {
const { openDestinationPicker } = require('disk/destination-picker');
function copyTo(file, context, layout)
{
openDestinationPicker({ objectId: file.id, operation: 'copy', context, parentWidget: layout });
}
module.exports = { copyTo };
});
Штатное меню показывает новый сценарий при features.destinationPicker === true и отсутствии context.uniqueCode. Внутри openDestinationPicker этих проверок нет, при прямом вызове делайте их сами. Флаг приходит в сетевом ответе списка, а в Disk 26.1500.0 серверный Configuration::isDestinationPickerEnabled() всегда возвращает true.
Если нужен свой интерфейс, в disk/destination-picker/src/api есть шесть асинхронных функций: getDestinationStorages, listDestinationFolders, searchDestinationFolders, checkDestination, applyDestination, createDestinationFolder. Они ходят в disk.api.Destination и сводят ответы к состояниям allowed, denied, gone, name_conflict, name_rejected, failed.
Открывайте HTML по единой ссылке
Если в данных файла есть links.htmlViewer, приложение открывает HTML-просмотр, а не сразу предлагает скачать файл. Для своих экранов есть htmlViewerOpener({ uniqueCode, title, parentWidget }) из disk/opener/html-viewer: он возвращает Promise<LayoutWidget> и открывает /mobile/disk/html-viewer.php, без uniqueCode Promise отклоняется. Сам просмотрщик HTML в этом обновлении не реализован.
В диалоге внешней ссылки карточка настроек безопасности теперь скрывается, когда сервер вернул externalLink.canEditSettings === false. Если поля нет, карточка остаётся.
Мелочи и находки
- Свои JN-расширения на
disk/pullпроверьте до обновления. MiddlewarecreateAddObjectsOnlyFromCurrentFolderMiddleware(currentFolderId)удалён без алиаса, замена —createAddedObjectRecipientsMiddleware(currentFolderId, itemIds). Экспортируемые middleware теперь отклоняют Promise объектомError, поэтому сравнивайтеerror.message, а не саму причину со строкой. - Pull-событие
objectAddedможет одним пакетом добавить файл и обновить строку его родительской папки. Для таких случаев экспортированыisParentFolderOnlyRecipientиbuildPullListMessage, а список единой ссылки больше не перезагружается целиком. renameByUnifiedLink(uniqueCode, newName, autoCorrect = true): третий аргумент теперь по умолчаниюtrue, то есть сервер сам поправит недопустимое имя. Нужна прежняя строгость — передайтеfalse.addSubFolderByUnifiedLink()получил четвёртый аргументautoCorrect = true, а выбор назначения отдельно показывает ошибкиname_empty,invalid_charactersиname_taken.- Список файлов передаёт через
getVoiceContextэкран, папку, хранилище, поиск, фильтр и сортировку. Это задел под голосовые сценарии, самих голосовых действий в версии нет.
Устаревшие и удалённые API в этой версии
| Символ | Статус | Чем заменять |
|---|---|---|
disk/pull:createAddObjectsOnlyFromCurrentFolderMiddleware
|
Удалено |
disk/pull:createAddedObjectRecipientsMiddleware
|