|
| 1 | +import '../../types'; |
| 2 | +import { h } from 'tsx-dom'; |
| 3 | +import { ContributionSurveyRevision } from '../../models/ContributionSurveyRevision'; |
| 4 | +import getRevisionURL from '../../wiki/util/getRevisionURL'; |
| 5 | +import getRevisionDiffURL from '../../wiki/util/getRevisionDiffURL'; |
| 6 | +import nsId from '../../wiki/util/nsId'; |
| 7 | + |
| 8 | +/** |
| 9 | + * @param root0 |
| 10 | + * @param root0.revid |
| 11 | + * @param root0.parentid |
| 12 | + * @return HTML element |
| 13 | + */ |
| 14 | +export function ChangesListLinks( |
| 15 | + { revid, parentid }: { revid: number, parentid: number } |
| 16 | +): JSX.Element { |
| 17 | + return <span class="mw-changeslist-links"> |
| 18 | + <span><a |
| 19 | + rel="noopener" |
| 20 | + href={ getRevisionDiffURL( revid, 0 ) } |
| 21 | + title={ mw.msg( 'deputy.session.revision.cur.tooltip' ) } |
| 22 | + target="_blank" |
| 23 | + >{ mw.msg( 'deputy.session.revision.cur' ) }</a></span> |
| 24 | + <span>{ |
| 25 | + !parentid ? |
| 26 | + mw.msg( 'deputy.session.revision.prev' ) : |
| 27 | + <a |
| 28 | + rel="noopener" |
| 29 | + href={ !parentid ? |
| 30 | + null : |
| 31 | + getRevisionDiffURL( parentid, revid ) |
| 32 | + } |
| 33 | + title={ mw.msg( 'deputy.session.revision.prev.tooltip' ) } |
| 34 | + target="_blank" |
| 35 | + >{ mw.msg( 'deputy.session.revision.prev' ) }</a> |
| 36 | + }</span> |
| 37 | + </span>; |
| 38 | +} |
| 39 | + |
| 40 | +/** |
| 41 | + * @return HTML element |
| 42 | + */ |
| 43 | +export function NewPageIndicator(): JSX.Element { |
| 44 | + return <abbr |
| 45 | + class="newpage" |
| 46 | + title={ mw.msg( 'deputy.session.revision.new.tooltip' ) } |
| 47 | + >{ mw.msg( 'deputy.session.revision.new' ) }</abbr>; |
| 48 | +} |
| 49 | +/** |
| 50 | + * @param root0 |
| 51 | + * @param root0.timestamp |
| 52 | + * @return HTML element |
| 53 | + */ |
| 54 | +export function ChangesListTime( |
| 55 | + { timestamp }: { timestamp: string } |
| 56 | +): JSX.Element { |
| 57 | + const time = new Date( timestamp ); |
| 58 | + const formattedTime = time.toLocaleTimeString( window.deputyLang, { |
| 59 | + hourCycle: 'h24', |
| 60 | + timeStyle: mw.user.options.get( 'date' ) === 'ISO 8601' ? 'long' : 'short' |
| 61 | + } ); |
| 62 | + |
| 63 | + return <span class="mw-changeslist-time">{ formattedTime }</span>; |
| 64 | +} |
| 65 | + |
| 66 | +/** |
| 67 | + * @param root0 |
| 68 | + * @param root0.revision |
| 69 | + * @return HTML element |
| 70 | + */ |
| 71 | +export function ChangesListDate( |
| 72 | + { revision }: { revision: ContributionSurveyRevision } |
| 73 | +): JSX.Element { |
| 74 | + const time = new Date( revision.timestamp ); |
| 75 | + let now = window.moment( time ); |
| 76 | + |
| 77 | + if ( window.deputy.config.cci.forceUtc.get() ) { |
| 78 | + now = now.utc(); |
| 79 | + } |
| 80 | + const formattedTime = time.toLocaleTimeString( window.deputyLang, { |
| 81 | + hourCycle: 'h24', |
| 82 | + timeStyle: mw.user.options.get( 'date' ) === 'ISO 8601' ? 'long' : 'short' |
| 83 | + } ); |
| 84 | + const formattedDate = now.locale( window.deputyLang ).format( { |
| 85 | + dmy: 'D MMMM YYYY', |
| 86 | + mdy: 'MMMM D, Y', |
| 87 | + ymd: 'YYYY MMMM D', |
| 88 | + 'ISO 8601': 'YYYY:MM:DD[T]HH:mm:SS' |
| 89 | + }[ mw.user.options.get( 'date' ) as string ] ); |
| 90 | + |
| 91 | + const comma = mw.msg( 'comma-separator' ); |
| 92 | + |
| 93 | + return <a class="mw-changeslist-date" href={ |
| 94 | + getRevisionURL( revision.revid, revision.page.title ) |
| 95 | + }>{ formattedTime }{ comma }{ formattedDate }</a>; |
| 96 | +} |
| 97 | + |
| 98 | +/** |
| 99 | + * @param root0 |
| 100 | + * @param root0.user |
| 101 | + * @return HTML element |
| 102 | + */ |
| 103 | +export function ChangesListUser( { user }: { user: string } ) { |
| 104 | + const userPage = new mw.Title( user, nsId( 'user' ) ); |
| 105 | + const userTalkPage = new mw.Title( user, nsId( 'user_talk' ) ); |
| 106 | + const userContribsPage = new mw.Title( 'Special:Contributions/' + user ); |
| 107 | + |
| 108 | + return <span class="history-user"> |
| 109 | + <a |
| 110 | + class="mw-userlink" |
| 111 | + target="_blank" |
| 112 | + rel="noopener" |
| 113 | + href={ mw.format( |
| 114 | + mw.config.get( 'wgArticlePath' ), |
| 115 | + userPage.getPrefixedDb() |
| 116 | + ) } |
| 117 | + title={ userPage.getPrefixedText() } |
| 118 | + >{ userPage.getPrefixedText() }</a> <span |
| 119 | + class="mw-usertoollinks mw-changeslist-links" |
| 120 | + ><span><a |
| 121 | + class="mw-usertoollinks-talk" |
| 122 | + target="_blank" |
| 123 | + rel="noopener" |
| 124 | + href={mw.format( |
| 125 | + mw.config.get( 'wgArticlePath' ), |
| 126 | + userTalkPage.getPrefixedDb() |
| 127 | + )} |
| 128 | + title={ userTalkPage.getPrefixedText() } |
| 129 | + >{ mw.msg( 'deputy.session.revision.talk' ) }</a></span> <span><a |
| 130 | + class="mw-usertoollinks-contribs" |
| 131 | + target="_blank" |
| 132 | + rel="noopener" |
| 133 | + href={mw.format( |
| 134 | + mw.config.get( 'wgArticlePath' ), |
| 135 | + userContribsPage.getPrefixedDb() |
| 136 | + )} |
| 137 | + title={ userContribsPage.getPrefixedText() } |
| 138 | + >{ mw.msg( 'deputy.session.revision.contribs' ) }</a></span> |
| 139 | + </span> |
| 140 | + </span>; |
| 141 | +} |
| 142 | + |
| 143 | +/** |
| 144 | + * @param root0 |
| 145 | + * @param root0.size |
| 146 | + * @return HTML element |
| 147 | + */ |
| 148 | +export function ChangesListBytes( { size }: { size: number } ): JSX.Element { |
| 149 | + return <span |
| 150 | + class="history-size mw-diff-bytes" |
| 151 | + data-mw-bytes={ size } |
| 152 | + >{ mw.message( 'deputy.session.revision.bytes', size.toString() ).text() }</span>; |
| 153 | +} |
| 154 | + |
| 155 | +/** |
| 156 | + * @param root0 |
| 157 | + * @param root0.diffsize |
| 158 | + * @param root0.size |
| 159 | + * @return HTML element |
| 160 | + */ |
| 161 | +export function ChangesListDiff( |
| 162 | + { diffsize, size }: { diffsize: number, size: number } |
| 163 | +): JSX.Element { |
| 164 | + const DiffTag = ( |
| 165 | + Math.abs( diffsize ) > 500 ? |
| 166 | + 'strong' : |
| 167 | + 'span' |
| 168 | + ) as keyof JSX.IntrinsicElements; |
| 169 | + |
| 170 | + return <DiffTag class={ `mw-plusminus-${ |
| 171 | + diffsize === 0 ? 'null' : |
| 172 | + ( diffsize > 0 ? 'pos' : 'neg' ) |
| 173 | + } mw-diff-bytes` } title={ |
| 174 | + mw.message( |
| 175 | + 'deputy.session.revision.byteChange', |
| 176 | + size.toString() |
| 177 | + ).text() |
| 178 | + }> |
| 179 | + { |
| 180 | + mw.message( |
| 181 | + `deputy.${ |
| 182 | + diffsize < 0 ? 'negative' : 'positive' |
| 183 | + }Diff`, |
| 184 | + diffsize.toString() |
| 185 | + ).text() |
| 186 | + } |
| 187 | + </DiffTag>; |
| 188 | +} |
| 189 | + |
| 190 | +/** |
| 191 | + * @param root0 |
| 192 | + * @param root0.tags |
| 193 | + * @return HTML element |
| 194 | + */ |
| 195 | +export function ChangesListTags( { tags }: { tags: string[] } ): JSX.Element { |
| 196 | + return <span class="mw-tag-markers"><a |
| 197 | + rel="noopener" |
| 198 | + href={mw.format( |
| 199 | + mw.config.get( 'wgArticlePath' ), |
| 200 | + 'Special:Tags' |
| 201 | + )} |
| 202 | + title="Special:Tags" |
| 203 | + target="_blank" |
| 204 | + >{ mw.message( |
| 205 | + 'deputy.session.revision.tags', |
| 206 | + tags.length.toString() |
| 207 | + ).text() }</a>{ |
| 208 | + tags.map( ( v ) => { |
| 209 | + // eslint-disable-next-line mediawiki/msg-doc |
| 210 | + const tagMessage = mw.message( `tag-${ v }` ).parse(); |
| 211 | + return tagMessage !== '-' && <span |
| 212 | + class={ `mw-tag-marker mw-tag-marker-${ v }` } |
| 213 | + dangerouslySetInnerHTML={ tagMessage } |
| 214 | + />; |
| 215 | + } ) |
| 216 | + } |
| 217 | + </span>; |
| 218 | +} |
0 commit comments