Files
Lauri Ojansivu 6f021aa387 Mobile / touch fixes (Fairphone 4 postmarketOS Firefox and Fairphone 4 Ubuntu Touch Morph browser; iPhone 12 Mini was already correct):
- Fixed one-finger drag-to-scroll not working in the All Boards view and the
  Calendar view on Fairphone 4 Firefox and Ubuntu Touch Morph. These browsers
  do not emit the synthetic mouse events the `@wekanteam/dragscroll` library
  relies on, so scrolling only worked in the Swimlanes/Lists views. Added a new
  native touch-scrolling helper `client/lib/dragscrollTouch.js` that scrolls the
  nearest `.dragscroll` container with a one-finger drag (iOS is skipped, since
  native momentum scrolling already works there), and added the `dragscroll`
  class to the All Boards list and the Calendar view.
- Fixed all text, buttons, the All Boards tables and the top bars (header and
  the second bar) rendering about 2x too large on Fairphone 4. `getMobileMode()`
  defaulted to mobile mode only for iPhone, so every other phone fell back to
  desktop mode, whose large desktop sizing looks oversized on a small phone
  screen. The default is now mobile mode for any phone-sized touch device
  (iPhone, Android/Mobile browsers, Ubuntu Touch, or a coarse-pointer touch
  screen with viewport width ≤ 800px); desktop browsers stay in desktop mode and
  the user's own Mobile/Desktop toggle still takes priority.
- Fixed not being able to reorder swimlanes and lists by dragging their drag
  handle on touch devices. The new touch-scroll helper was hijacking touches
  that started on a drag handle; `.handle` / `.ui-sortable-handle` elements are
  now excluded from touch-scrolling so dragging the handle reorders as expected.
- Fixed a card duplicating into two cards when it was dragged by its title-row
  drag handle while its Card Details panel was open. The card sortable in
  `client/components/lists/list.js` was re-initialized on every list re-render
  without first destroying the previous instance, so two `stop` handlers fired
  per drag. It now destroys any existing sortable before re-initializing, the
  same guard already used for swimlanes.

Attachment storage:

- Added configurable attachment storage backends in the admin panel: choose the
  default save storage and store attachments on the local filesystem, GridFS, or
  cloud object storage — S3-compatible (AWS S3, MinIO, Cloudflare R2, Backblaze
  B2, Wasabi, DigitalOcean Spaces), Azure Blob Storage, or Google Cloud Storage
  — via the `@tweedegolf/storage-abstraction` adapters (new
  `models/lib/cloudStorage.js`). Includes a "Test connection" action and
  English translations for the new settings.
- Added a server-side bulk attachment move (new `server/attachmentBulkMove.js`
  and `models/attachmentBulkMoveStatus.js`) that moves all attachments from one
  storage backend to another as a background job whose progress survives the
  admin navigating away from or closing the page.

Thanks to xet7.
2026-05-31 11:12:41 +03:00

110 lines
4.4 KiB
JavaScript

// ============================================================================
// WeKan Client — All Imports
// Loaded by client/main.js after bootstrap (collectionHelpers) completes.
// ============================================================================
// ----------------------------------------------------------------------------
// 1. Shared imports (i18n, utilities, reactive cache)
// ----------------------------------------------------------------------------
import '/imports/i18n/index';
import '/imports/i18n/accounts';
import '/imports/i18n/blaze';
import '/imports/i18n/languages';
import '/imports/i18n/moment';
import '/imports/i18n/tap';
import '/imports/lib/customHeadDefaults';
import '/imports/lib/dateUtils';
import '/imports/lib/secureDOMPurify';
import '/models/attachmentMigrationStatus';
import '/models/attachmentBulkMoveStatus';
import '/imports/cronMigrationClient';
// ----------------------------------------------------------------------------
// 3. Shared models/collections
// ----------------------------------------------------------------------------
import '/imports/startup/shared-models';
// ----------------------------------------------------------------------------
// 4. Shared runtime services
// ----------------------------------------------------------------------------
import '/imports/reactiveCache';
// ----------------------------------------------------------------------------
// 5. Config (shared)
// ----------------------------------------------------------------------------
import '/config/accounts';
import '/config/const';
import '/config/models';
import '/config/query-classes';
import '/config/router';
import '/config/search-const';
// ----------------------------------------------------------------------------
// 6. Client library files
// ----------------------------------------------------------------------------
import '/client/lib/accessibility';
import '/client/lib/attachmentMigrationManager';
import '/client/lib/autofocus';
import '/client/lib/boardConverter';
import '/client/lib/boardMultiSelection';
import '/client/lib/cardSearch';
import '/client/lib/cssEvents';
import '/client/lib/currentCard';
import '/client/lib/customFields';
import '/client/lib/datepicker';
import '/client/lib/dialogWithBoardSwimlaneList';
import '/client/lib/dialogWithBoardSwimlaneListCard';
import '/client/lib/dropImage';
import '/client/lib/escapeActions';
import '/client/lib/exportHTML';
import '/client/lib/filter';
import '/client/lib/fixDuplicateLists';
import '/client/lib/i18n';
import '/client/lib/infiniteScrolling';
import '/client/lib/jquery-ui';
import '/client/lib/localStorageValidator';
import '/client/lib/modal';
import '/client/lib/multiSelection';
import '/client/lib/originalPositionHelpers';
import '/client/lib/pasteImage';
import '/client/lib/secureDOMPurify';
import '/client/lib/spinner';
import '/client/lib/textComplete';
import '/client/lib/unsavedEdits';
import '/client/lib/uploadProgressManager';
import '/client/lib/utils';
// ----------------------------------------------------------------------------
// 7. Client config
// ----------------------------------------------------------------------------
import '/client/config/blazeHelpers';
import '/client/config/gecko-fix';
// ----------------------------------------------------------------------------
// 8. Client features
// Each feature entry owns its template/logic/style ordering.
// ----------------------------------------------------------------------------
import '/client/features/forms';
import '/client/features/main';
import '/client/features/settings';
import '/client/features/sidebar';
import '/client/features/users';
import '/client/features/activities';
import '/client/features/boardConversion';
import '/client/features/gantt';
import '/client/features/boards';
import '/client/features/cards';
import '/client/features/common';
import '/client/features/importing';
import '/client/features/libComponents';
import '/client/features/lists';
import '/client/features/notifications';
import '/client/features/rules';
import '/client/features/swimlanes';
import '/client/features/unicodeIcons';
// ----------------------------------------------------------------------------
// 8. Startup (must load last — registers service worker, sets up subscriptions)
// ----------------------------------------------------------------------------
import '/client/00-startup';