@@ -80,6 +80,10 @@ window.onload = async () => {
8080 reader . readAsText ( file ) ;
8181 } ) ;
8282
83+ document . querySelector ( "#delete-feed-selection" ) . addEventListener ( "click" , ( ) => {
84+ FeedMultiSelection . removeSelectedFeeds ( ) ;
85+ } ) ;
86+
8387 loadFeeds ( ) ;
8488 LivemarkStore . addChangeListener ( loadFeeds ) ;
8589 browser . bookmarks . onChanged . addListener ( async ( id ) => {
@@ -159,15 +163,84 @@ async function loadFeeds() {
159163 feed . title = I18N . getMessage ( "settings_brokenLivemark" ) ;
160164 addFeedToList ( feed , true ) ;
161165 } ) ;
166+
167+ FeedMultiSelection . reset ( ) ;
162168}
163169
170+ const FeedMultiSelection = {
171+ selection : new Set ( ) ,
172+ selectAllCheckbox : document . getElementById ( "select-all-checkbox" ) ,
173+ async _updateSelectAllCheckboxState ( ) {
174+ const size = await LivemarkStore . getSize ( ) ;
175+ const isEmptySelection = this . selection . size == 0 ;
176+ this . selectAllCheckbox . indeterminate = ! isEmptySelection && this . selection . size < size ;
177+ this . selectAllCheckbox . checked = ! isEmptySelection && this . selection . size == size ;
178+ this . selectAllCheckbox . disabled = size == 0 ;
179+ document . getElementById ( "selection-toolbar" ) . hidden = size == 0 ;
180+ } ,
181+ addToSelection ( feed ) {
182+ this . selection . add ( feed ) ;
183+ this . _updateSelectAllCheckboxState ( ) ;
184+ } ,
185+ addAllToSelection ( ) {
186+ for ( const element of document . querySelectorAll ( "#feeds > .feed" ) ) {
187+ this . selection . add ( element . feedData ) ;
188+ element . querySelector ( ".feed-checkbox" ) . checked = true ;
189+ }
190+ this . _updateSelectAllCheckboxState ( ) ;
191+ } ,
192+ removeFromSelection ( feed ) {
193+ this . selection . delete ( feed ) ;
194+ this . _updateSelectAllCheckboxState ( ) ;
195+ } ,
196+ reset ( ) {
197+ this . selection . clear ( ) ;
198+ for ( const element of document . querySelectorAll ( "#feeds > .feed" ) ) {
199+ element . querySelector ( ".feed-checkbox" ) . checked = false ;
200+ }
201+ this . _updateSelectAllCheckboxState ( ) ;
202+
203+ // XXX: probably doesn't belong here...
204+ this . selectAllCheckbox . onchange = ( ) => {
205+ if ( this . selectAllCheckbox . checked ) {
206+ this . addAllToSelection ( ) ;
207+ } else {
208+ this . reset ( ) ;
209+ }
210+ } ;
211+ } ,
212+
213+ moveSelectedFeeds ( folder ) {
214+ // XXX: todo
215+ } ,
216+ async removeSelectedFeeds ( ) {
217+ for ( const feed of this . selection ) {
218+ await LivemarkStore . remove ( feed . id ) ;
219+ }
220+ this . selection . clear ( ) ;
221+ }
222+ } ;
223+
164224function addFeedToList ( feed , broken = false ) {
165225 const item = document . createElement ( "div" ) ;
166226 item . className = "feed card" ;
227+ item . feedData = feed ;
167228 if ( broken ) {
168229 item . classList . add ( "broken" ) ;
169230 }
170231
232+ const checkbox = document . createElement ( "input" ) ;
233+ checkbox . type = "checkbox" ;
234+ checkbox . className = "feed-checkbox" ;
235+ checkbox . onchange = ( ) => {
236+ if ( checkbox . checked ) {
237+ FeedMultiSelection . addToSelection ( feed ) ;
238+ } else {
239+ FeedMultiSelection . removeFromSelection ( feed ) ;
240+ }
241+ } ;
242+ item . appendChild ( checkbox ) ;
243+
171244 const feedTitle = document . createElement ( "span" ) ;
172245 feedTitle . textContent = feed . title ;
173246 feedTitle . className = "feed-title" ;
0 commit comments