├── scripts ├── .htaccess ├── remotecheck.sh ├── pre-review └── hooks-shared.sh ├── modules ├── flow │ ├── dm │ │ ├── mw.flow.dm.js │ │ ├── mw.flow.dm.Categories.js │ │ ├── mw.flow.dm.BoardDescription.js │ │ └── mw.flow.dm.CategoryItem.js │ ├── mw.flow.js │ └── ui │ │ └── mw.flow.ui.js ├── styles │ ├── history │ │ └── history-line.less │ ├── flow │ │ ├── widgets │ │ │ ├── mw.flow.ui.CategoryItemWidget.less │ │ │ ├── mw.flow.ui.ReplyWidget.less │ │ │ ├── mw.flow.ui.CategoriesWidget.less │ │ │ ├── editor │ │ │ │ ├── mw.flow.ui.EditorControlsWidget.less │ │ │ │ ├── mw.flow.ui.CanNotEditWidget.less │ │ │ │ └── mw.flow.ui.AnonWarningWidget.less │ │ │ ├── mw.flow.ui.TopicTitleWidget.less │ │ │ ├── mw.flow.ui.ReorderTopicsWidget.less │ │ │ ├── mw.flow.ui.SidebarExpandWidget.less │ │ │ └── mw.flow.ui.TopicMenuSelectWidget.less │ │ └── images │ │ │ ├── newestTopics.svg │ │ │ ├── topicCollapse-ltr.svg │ │ │ └── topicCollapse-rtl.svg │ ├── nojs.less │ ├── errors.less │ ├── flow.colors.less │ ├── flow.variables.less │ └── board │ │ ├── terms-of-use.less │ │ ├── moderated.less │ │ ├── topic │ │ ├── summary.less │ │ └── meta.less │ │ ├── replycount.less │ │ └── form-actions.less ├── editor │ └── editors │ │ └── visualeditor │ │ ├── .eslintrc.json │ │ ├── mw.flow.ve.SequenceRegistry.js │ │ └── mw.flow.ve.CommandRegistry.js ├── tours │ ├── flow-icon.svg │ └── flowOptIn.less ├── notification │ └── icon │ │ ├── flow-topic-resolved-rtl.svg │ │ ├── flow-topic-resolved-ltr.svg │ │ ├── flow-topic-renamed-rtl.svg │ │ ├── flow-topic-renamed-ltr.svg │ │ ├── flow-new-topic-ltr.svg │ │ ├── flow-new-topic-rtl.svg │ │ ├── flow-topic-reopened-rtl.svg │ │ ├── flow-post-edited-rtl.svg │ │ ├── flow-topic-reopened-ltr.svg │ │ └── flow-post-edited-ltr.svg ├── .eslintrc.json ├── handlebars.js ├── contributions │ └── base.js └── engine │ └── components │ ├── common │ └── flow-component-engines.js │ └── board │ └── base │ └── flow-board-load-events.js ├── .gitattributes ├── handlebars ├── flow_block_topic_lock.handlebars ├── flow_block_topiclist_newtopic.handlebars ├── flow_block_loop.handlebars ├── flow_header_footer.partial.handlebars ├── flow_post.handlebars ├── flow_header_title.partial.handlebars ├── flow_topiclist_loop.partial.handlebars ├── flow_tooltip_subscribed.partial.handlebars ├── flow_tooltip.handlebars ├── flow_block_topic.handlebars ├── flow_block_topic_moderate_post.handlebars ├── flow_block_topic_edit_title.handlebars ├── flow_block_board-history.handlebars ├── flow_block_header.handlebars ├── flow_topic_moderation_flag.partial.handlebars ├── flow_block_topic_moderate_topic.handlebars ├── flow_errors.partial.handlebars ├── flow_post_moderation_state.partial.handlebars ├── flow_block_topic_history.handlebars ├── flow_header_edit_restrictions.partial.handlebars ├── flow_post_replies.partial.handlebars ├── flow_board_navigation.partial.handlebars ├── flow_block_header_diff_view.handlebars ├── flow_header_categories.partial.handlebars ├── flow_patrol_action.partial.handlebars ├── flow_post_inner.partial.handlebars ├── flow_patrol_diff.partial.handlebars ├── flow_block_topicsummary_diff_view.handlebars ├── flow_block_topic_diff_view.handlebars ├── timestamp.handlebars ├── flow_post_actions.partial.handlebars ├── flow_subscribed.partial.handlebars ├── flow_header_detail.partial.handlebars ├── flow_edit_topic_title.partial.handlebars ├── flow_block_header_single_view.handlebars ├── flow_block_topiclist.handlebars ├── flow_topic_titlebar.partial.handlebars ├── flow_revision_diff_header.handlebars ├── flow_anon_warning.partial.handlebars ├── flow_block_topicsummary_single_view.handlebars ├── flow_topic_titlebar_summary.partial.handlebars ├── flow_block_topic_single_view.handlebars ├── flow_post_partial.partial.handlebars ├── flow_topic_titlebar_watch.partial.handlebars └── flow_edit_post.partial.handlebars ├── .eslintrc.json ├── i18n ├── ks.json ├── cu.json ├── hil.json ├── aeb-arab.json ├── bug.json ├── krl.json ├── lkt.json ├── yo.json ├── bnn.json ├── tk.json ├── zh-hk.json ├── udm.json ├── cdo-latn.json ├── dsb.json ├── hak-latn.json ├── sw.json ├── api │ ├── ms.json │ ├── id.json │ ├── km.json │ ├── pam.json │ ├── ps.json │ ├── da.json │ ├── te.json │ ├── en-gb.json │ ├── sje.json │ ├── ku-latn.json │ ├── lki.json │ ├── sd.json │ ├── diq.json │ ├── got.json │ ├── oc.json │ ├── gom-deva.json │ ├── eu.json │ ├── roa-tara.json │ ├── el.json │ ├── ckb.json │ ├── bn.json │ ├── ca.json │ ├── shn.json │ ├── ur.json │ ├── lb.json │ └── vec.json ├── nan-latn-pehoeji.json ├── nog.json ├── kiu.json ├── sdh.json ├── lrc.json ├── mzn.json ├── vo.json ├── ms-arab.json ├── tyv.json ├── got.json ├── qu.json ├── bgn.json ├── mhr.json ├── su.json ├── ady-cyrl.json ├── gd.json ├── hsb.json ├── nds.json ├── nds-nl.json ├── yue-hant.json ├── km.json ├── os.json ├── lo.json ├── sjd.json ├── bgc-arab.json ├── cy.json ├── ksw.json ├── ug-arab.json ├── blk.json ├── ie.json ├── anp.json ├── ht.json ├── bcc.json ├── mnw.json ├── as.json ├── myv.json ├── frr.json ├── mai.json ├── ee.json ├── om.json ├── gsw.json ├── uz.json ├── af.json ├── lag.json ├── btm.json ├── ig.json ├── kjp.json ├── tly.json ├── sq.json ├── ti.json ├── bho.json ├── tt-cyrl.json ├── crh-latn.json ├── lzh.json ├── ban.json ├── es-formal.json ├── xmf.json ├── azb.json ├── pam.json ├── dty.json ├── ary.json ├── mn.json ├── en-gb.json ├── az.json ├── pnb.json ├── hyw.json ├── olo.json ├── inh.json ├── mt.json ├── shn.json ├── be-tarask.json ├── fy.json ├── lki.json ├── si.json └── ami.json ├── tests ├── api-testing │ └── .eslintrc.json ├── qunit │ ├── .eslintrc.json │ └── flow │ │ └── dm │ │ └── test_mw.flow.dm.Content.js └── phpunit │ ├── unit │ ├── HookRunnerTest.php │ └── FlowActionsTest.php │ ├── Mock │ ├── MockImportSummary.php │ ├── MockImportHeader.php │ ├── ExternalStoreFlowMock.php │ ├── MockImportSource.php │ ├── MockImportRevision.php │ ├── MockImportPost.php │ └── MockImportTopic.php │ ├── Data │ ├── ObjectLocatorTest.php │ └── CachingObjectMapperTest.php │ ├── integration │ ├── Import │ │ └── HistoricalUIDGeneratorTest.php │ └── Parsoid │ │ └── ReferenceFactoryTest.php │ └── ContainerTest.php ├── .gitreview ├── sql └── mysql │ ├── patch-flow_revision-rev_mod_timestamp.sql │ ├── patch-increase-varchar-flow_ext_ref-ref_src_wiki.sql │ └── patch-increase-varchar-flow_wiki_ref-ref_src_wiki.sql ├── includes ├── Import │ ├── IImportHeader.php │ ├── IImportSummary.php │ ├── IImportPost.php │ ├── ImportException.php │ ├── IRevisionableObject.php │ ├── LiquidThreadsApi │ │ ├── CachedApiData.php │ │ ├── CachedPageData.php │ │ ├── ApiNotFoundException.php │ │ ├── MovedImportPost.php │ │ ├── MovedImportTopic.php │ │ └── ImportSummary.php │ ├── SourceStore │ │ ├── Exception.php │ │ ├── NullImportSourceStore.php │ │ └── SourceStoreInterface.php │ ├── IImportSource.php │ ├── IImportObject.php │ ├── IObjectRevision.php │ ├── IImportTopic.php │ ├── EnableFlow │ │ └── EnableFlowWikitextConversionStrategy.php │ └── Plain │ │ └── ImportHeader.php ├── Exception │ ├── CrossWikiException.php │ ├── NoIndexException.php │ ├── InvalidReferenceException.php │ ├── NoParserException.php │ ├── FailCommitException.php │ ├── CatchableFatalErrorException.php │ ├── DataModelException.php │ ├── DataPersistenceException.php │ ├── WikitextException.php │ ├── PermissionException.php │ ├── UnknownWorkflowIdException.php │ ├── InvalidParameterException.php │ ├── InvalidDataException.php │ ├── WrongNumberArgumentsException.php │ └── InvalidActionException.php ├── Formatter │ ├── ContributionsRow.php │ ├── DeletedContributionsRow.php │ ├── RecentChangesRow.php │ ├── TopicRow.php │ ├── HeaderViewQuery.php │ ├── PostViewQuery.php │ ├── PostSummaryViewQuery.php │ ├── PostSummaryQuery.php │ └── CategoryViewerFormatter.php ├── Parsoid │ ├── Fixer.php │ ├── Extractor.php │ └── Extractor │ │ ├── ExtLinkExtractor.php │ │ ├── WikiLinkExtractor.php │ │ └── ImageExtractor.php ├── Data │ ├── Storage │ │ ├── HeaderRevisionStorage.php │ │ ├── PostSummaryRevisionStorage.php │ │ ├── PostSummaryRevisionBoardHistoryStorage.php │ │ └── PostRevisionBoardHistoryStorage.php │ ├── Index │ │ ├── PostSummaryRevisionBoardHistoryIndex.php │ │ ├── PostRevisionBoardHistoryIndex.php │ │ └── UniqueFeatureIndex.php │ ├── Utils │ │ └── RecentChangeFactory.php │ ├── Listener │ │ ├── AbstractListener.php │ │ └── EditCountListener.php │ ├── LifecycleHandler.php │ └── Pager │ │ └── PagerPage.php ├── Repository │ ├── TitleRepository.php │ ├── UserName │ │ └── UserNameQuery.php │ └── TreeCacheKey.php ├── Model │ ├── UUIDBlob.php │ └── AbstractSummary.php ├── Collection │ ├── HeaderCollection.php │ └── PostSummaryCollection.php ├── Diff │ └── FlowBoardContentDiffView.php ├── Hooks │ ├── APIFlowAfterExecuteHook.php │ ├── FlowAddModulesHook.php │ ├── FlowCheckHtmlContentXssHook.php │ └── FlowTermsOfUseMessagesHook.php ├── Search │ └── Iterators │ │ └── HeaderIterator.php ├── SpamFilter │ ├── SpamFilter.php │ └── RateLimits.php ├── RecoverableErrorHandler.php ├── Actions │ └── EditAction.php ├── Api │ ├── ApiFlowUndoEditPost.php │ ├── ApiFlowViewTopic.php │ ├── ApiFlowViewTopicHistory.php │ ├── ApiFlowViewHeader.php │ ├── ApiFlowUndoEditHeader.php │ ├── ApiFlowUndoEditTopicSummary.php │ ├── ApiFlowModerateTopic.php │ ├── ApiFlowEditTitle.php │ ├── ApiFlowViewTopicSummary.php │ ├── ApiFlowViewPostHistory.php │ └── ApiFlowViewPost.php ├── Notifications │ ├── MentionStatusPresentationModel.php │ └── FlowEnabledOnTalkpagePresentationModel.php └── Log │ └── LogQuery.php ├── CODE_OF_CONDUCT.md ├── README ├── .gitignore ├── .stylelintrc.json ├── defines.php ├── package.json ├── CONTRIBUTING.md ├── src └── Hooks │ └── AbuseFilterHandler.php └── composer.json /scripts/.htaccess: -------------------------------------------------------------------------------- 1 | Require all denied 2 | -------------------------------------------------------------------------------- /modules/flow/dm/mw.flow.dm.js: -------------------------------------------------------------------------------- 1 | mw.flow.dm = {}; 2 | -------------------------------------------------------------------------------- /modules/flow/mw.flow.js: -------------------------------------------------------------------------------- 1 | mw.flow = mw.flow || {}; 2 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | handlebars/compiled/* -diff -whitespace 2 | -------------------------------------------------------------------------------- /handlebars/flow_block_topic_lock.handlebars: -------------------------------------------------------------------------------- 1 | {{>flow_topic_titlebar_lock}} 2 | 3 | -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "root": true, 3 | "extends": [ 4 | "wikimedia/server" 5 | ] 6 | } 7 | -------------------------------------------------------------------------------- /i18n/ks.json: -------------------------------------------------------------------------------- 1 | { 2 | "@metadata": { 3 | "authors": [] 4 | }, 5 | "nstab-topic": "موضوٗع" 6 | } 7 | -------------------------------------------------------------------------------- /modules/styles/history/history-line.less: -------------------------------------------------------------------------------- 1 | .flow-history-moderation-action { 2 | text-transform: lowercase; 3 | } 4 | -------------------------------------------------------------------------------- /i18n/cu.json: -------------------------------------------------------------------------------- 1 | { 2 | "@metadata": { 3 | "authors": [ 4 | "ОйЛ" 5 | ] 6 | }, 7 | "flow-undo": "отъмѣтаниѥ" 8 | } 9 | -------------------------------------------------------------------------------- /i18n/hil.json: -------------------------------------------------------------------------------- 1 | { 2 | "@metadata": { 3 | "authors": [ 4 | "Pare Mo" 5 | ] 6 | }, 7 | "flow-cancel": "Kanselaron" 8 | } 9 | -------------------------------------------------------------------------------- /tests/api-testing/.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "root": true, 3 | "extends": [ 4 | "wikimedia/server", 5 | "wikimedia/mocha" 6 | ] 7 | } 8 | -------------------------------------------------------------------------------- /.gitreview: -------------------------------------------------------------------------------- 1 | [gerrit] 2 | host=gerrit.wikimedia.org 3 | port=29418 4 | project=mediawiki/extensions/Flow.git 5 | track=1 6 | defaultrebase=0 7 | -------------------------------------------------------------------------------- /handlebars/flow_block_topiclist_newtopic.handlebars: -------------------------------------------------------------------------------- 1 |
3 | {{{ oouify 4 | 'lock' 5 | type="IconWidget" 6 | classes="flow-board-header-restricted-icon" 7 | }}} 8 | 9 | {{l10n "flow-board-description-can-not-edit"}} 10 |
11 | {{/unless}} 12 | -------------------------------------------------------------------------------- /i18n/gsw.json: -------------------------------------------------------------------------------- 1 | { 2 | "@metadata": { 3 | "authors": [ 4 | "Als-Holder", 5 | "J. 'mach' wust" 6 | ] 7 | }, 8 | "flow-post-action-edit-post-submit": "Änderige spychere", 9 | "flow-post-action-edit-post-submit-anonymously": "Änderigen anonym spychere", 10 | "echo-category-title-flow-discussion": "Flow", 11 | "echo-pref-tooltip-flow-discussion": "Hiwyse, we mi en Aktion im Flow betrifft." 12 | } 13 | -------------------------------------------------------------------------------- /i18n/uz.json: -------------------------------------------------------------------------------- 1 | { 2 | "@metadata": { 3 | "authors": [ 4 | "Malikxan", 5 | "Sociologist" 6 | ] 7 | }, 8 | "flow-skip-summary": "Oʻtkazib yuborish", 9 | "flow-show-change": "Oʻzgarishlarni koʻrsat", 10 | "flow-thank-link": "{{GENDER:$1|{{GENDER:$2|Rahmat}}}}", 11 | "flow-rev-message-edit-post-recentchanges-summary": "Xabarni {{GENDER:$2|tahrirladi}}", 12 | "flow-history-day": "Bugun" 13 | } 14 | -------------------------------------------------------------------------------- /modules/styles/flow/widgets/editor/mw.flow.ui.EditorControlsWidget.less: -------------------------------------------------------------------------------- 1 | @import '../../../flow.colors.less'; 2 | @import '../../../flow.variables.less'; 3 | 4 | .flow-ui-editorControlsWidget { 5 | margin-top: 8px; 6 | 7 | &-buttons { 8 | float: right; 9 | } 10 | 11 | &-termsLabel { 12 | color: @color-subtle; 13 | width: 66.6%; 14 | margin-top: 4px; 15 | font-size: 0.75em; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /i18n/af.json: -------------------------------------------------------------------------------- 1 | { 2 | "@metadata": { 3 | "authors": [ 4 | "Oesjaar", 5 | "Rooiratel" 6 | ] 7 | }, 8 | "flow-topic-moderated-reason-prefix": "Rede:", 9 | "flow-post-actions": "Aksies", 10 | "flow-summary-authored": "Opsomming deur $1", 11 | "flow-newtopic-save": "Voeg onderwerp by", 12 | "flow-board-notification-subscribe-title": "{{GENDER:$1|Jy is}} ingeteken op hierdie besprekingsbord!" 13 | } 14 | -------------------------------------------------------------------------------- /i18n/lag.json: -------------------------------------------------------------------------------- 1 | { 2 | "@metadata": { 3 | "authors": [ 4 | "Baba Tabita" 5 | ] 6 | }, 7 | "flow-history-action-delete-post": "honola", 8 | "flow-post-action-delete-post": "Honola", 9 | "flow-moderation-confirm-delete-post": "Honola", 10 | "flow-moderation-confirm-delete-topic": "Honola", 11 | "flow-moderation-confirm-hide-topic": "Visa", 12 | "flow-moderation-confirm-unhide-topic": "Visʉla" 13 | } 14 | -------------------------------------------------------------------------------- /i18n/btm.json: -------------------------------------------------------------------------------- 1 | { 2 | "@metadata": { 3 | "authors": [ 4 | "Simartampua" 5 | ] 6 | }, 7 | "flow-post-action-edit-post-submit-publish": "Torbitkon parubaan", 8 | "flow-post-action-edit-post-submit-anonymously-publish": "Torbitkon parubaan sacara anonim", 9 | "flow-edit-header-submit-publish": "Torbitkon deskripsi", 10 | "flow-edit-header-submit-anonymously-publish": "Torbitkon deskripsi dohot anonim" 11 | } 12 | -------------------------------------------------------------------------------- /i18n/ig.json: -------------------------------------------------------------------------------- 1 | { 2 | "@metadata": { 3 | "authors": [ 4 | "Ukabia" 5 | ] 6 | }, 7 | "flow-cancel": "Hapụ̀", 8 | "flow-post-action-edit-post": "Mèzi", 9 | "flow-post-action-undo-moderation": "Me la àzụ", 10 | "flow-topic-action-watchlist": "Ùlìle", 11 | "flow-topic-action-undo-moderation": "Me la àzụ", 12 | "echo-category-title-flow-discussion": "Nkpata okà Ǹrùzìrì", 13 | "flow-undo": "Me la àzụ" 14 | } 15 | -------------------------------------------------------------------------------- /tests/phpunit/unit/HookRunnerTest.php: -------------------------------------------------------------------------------- 1 | [ HookRunner::class ]; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /includes/Model/UUIDBlob.php: -------------------------------------------------------------------------------- 1 | fetch(); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /includes/Collection/HeaderCollection.php: -------------------------------------------------------------------------------- 1 | getId(); 12 | } 13 | 14 | public function getBoardWorkflowId() { 15 | return $this->getId(); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /i18n/api/eu.json: -------------------------------------------------------------------------------- 1 | { 2 | "@metadata": { 3 | "authors": [ 4 | "Mikel Ibaiba", 5 | "Subi" 6 | ] 7 | }, 8 | "apihelp-flow+edit-topic-summary-param-summary": "Laburpenaren edukia.", 9 | "apihelp-flow+edit-topic-summary-param-format": "Laburpaneren formatua (wikitestua|html)", 10 | "apihelp-flow+undo-edit-post-summary": "Editatzen ari zaren argitalpena desegiteko beharrezkoa den informazioa berriro lortu behar da." 11 | } 12 | -------------------------------------------------------------------------------- /modules/notification/icon/flow-topic-renamed-rtl.svg: -------------------------------------------------------------------------------- 1 | 2 | 8 | -------------------------------------------------------------------------------- /i18n/api/roa-tara.json: -------------------------------------------------------------------------------- 1 | { 2 | "@metadata": { 3 | "authors": [ 4 | "Joetaras" 5 | ] 6 | }, 7 | "apihelp-flow+edit-post-param-postId": "ID d'u messàgge.", 8 | "apihelp-flow+edit-title-summary": "Cange 'u titole de 'n'argomende.", 9 | "apihelp-flow+reply-summary": "Resposte a 'nu messàgge.", 10 | "apihelp-flow+reply-param-replyTo": "ID d'u messàgge da responnere.", 11 | "apihelp-flow+view-topic-summary": "'Ndruche 'n'argomende." 12 | } 13 | -------------------------------------------------------------------------------- /i18n/api/el.json: -------------------------------------------------------------------------------- 1 | { 2 | "@metadata": { 3 | "authors": [ 4 | "NikosLikomitros", 5 | "Nikosgranturismogt" 6 | ] 7 | }, 8 | "apihelp-flow+view-post-summary": "Προβολή ανάρτησης.", 9 | "apihelp-flow+view-post-param-postId": "Αναγνωριστικό της ανάρτησης για προβολή.", 10 | "apihelp-flow+view-post-history-summary": "Προβολή του ιστορικού αναθεωρήσεων για μια ανάρτηση.", 11 | "apihelp-flow+view-topic-summary": "Προβολή ενός θέματος." 12 | } 13 | -------------------------------------------------------------------------------- /includes/Formatter/HeaderViewQuery.php: -------------------------------------------------------------------------------- 1 | storage->get( 18 | 'Header', 19 | $revId 20 | ); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /handlebars/flow_post_replies.partial.handlebars: -------------------------------------------------------------------------------- 1 |