class TimelinesController < ApplicationController before_action :authenticate_user!, except: [:show] before_action :set_timeline, only: [:show, :edit, :update, :destroy] before_action :set_navbar_color before_action :set_sidenav_expansion # GET /timelines def index @timelines = current_user.timelines @page_title = "My timelines" if @universe_scope @timelines = @timelines.where(universe: @universe_scope) end @page_tags = PageTag.where( page_type: Timeline.name, page_id: @timelines.pluck(:id) ).order(:tag) if params.key?(:tag) @filtered_page_tags = @page_tags.where(slug: params[:tag]) @timelines = @timelines.select { |timeline| @filtered_page_tags.pluck(:page_id).include?(timeline.id) } end # if params.key?(:favorite_only) # @content.select!(&:favorite?) # end end def show @page_title = @timeline.name unless @timeline.privacy == 'public' || (user_signed_in? && current_user == @timeline.user) return redirect_back(fallback_location: root_path, notice: "You don't have permission to view that timeline!") end end # GET /timelines/new def new timeline = current_user.timelines.create(name: 'Untitled Timeline', universe: @universe_scope).reload redirect_to edit_timeline_path(timeline) end # GET /timelines/1/edit def edit @page_title = "Editing " + @timeline.name @suggested_page_tags = [] raise "No Access" unless user_signed_in? && current_user == @timeline.user end # POST /timelines def create @page_title = "Create a timeline" # TODO this endpoint is probably just API-only, right? @timeline = Timeline.new(timeline_params) if current_user.on_premium_plan? && @timeline.save redirect_to @timeline, notice: 'Timeline was successfully created.' else render :new end end # PATCH/PUT /timelines/1 def update return unless user_signed_in? && current_user == @timeline.user if @timeline.update(timeline_params) update_page_tags render status: 200, json: @timeline.reload else render status: 501, json: @timeline.errors end end # DELETE /timelines/1 def destroy @timeline.destroy redirect_to timelines_url, notice: 'Timeline was successfully destroyed.' end private # TODO: move this (and the copy in ContentController) into the has_page_tags concern? def update_page_tags tag_list = page_tag_params.split(PageTag::SUBMISSION_DELIMITER) current_tags = @timeline.page_tags.pluck(:tag) tags_to_add = tag_list - current_tags tags_to_remove = current_tags - tag_list tags_to_add.each do |tag| @timeline.page_tags.find_or_create_by( tag: tag, slug: PageTagService.slug_for(tag), user: @timeline.user ) end tags_to_remove.each do |tag| @timeline.page_tags.find_by(tag: tag).destroy end end # Use callbacks to share common setup or constraints between actions. def set_timeline @timeline = Timeline.find(params[:id]) end # Only allow a trusted parameter "white list" through. def timeline_params params.require(:timeline).except(:page_tags).permit(:name, :subtitle, :description, :notes, :private_notes, :universe_id, :deleted_at, :archived_at, :privacy) end def page_tag_params params.require(:timeline).fetch(:page_tags, "") end def set_navbar_color @navbar_color = Timeline.hex_color.presence || '#2196F3' end def set_sidenav_expansion @sidenav_expansion = 'writing' end end